Salome HOME
Merge from BR_V5_DEV 16Feb09
[modules/med.git] / src / MEDMEMBinTest / create_grid.c
1 //  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
2 //
3 //  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 //  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
5 //
6 //  This library is free software; you can redistribute it and/or
7 //  modify it under the terms of the GNU Lesser General Public
8 //  License as published by the Free Software Foundation; either
9 //  version 2.1 of the License.
10 //
11 //  This library is distributed in the hope that it will be useful,
12 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 //  Lesser General Public License for more details.
15 //
16 //  You should have received a copy of the GNU Lesser General Public
17 //  License along with this library; if not, write to the Free Software
18 //  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
19 //
20 //  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 //
22 /*----------------------------------------------------------------------------
23   MED MEDMEM : MED files in memory
24
25   File   : create_grid.c
26   Module : MED
27 ----------------------------------------------------------------------------*/
28
29 /******************************************************************************
30  * - Nom du fichier : test19.c
31  *
32  * - Description : ecriture des objets MED relatifs aux grilles
33  *                 MED V2.0
34  *
35  *****************************************************************************/
36
37 #include <med.h>
38 #include <string.h>
39
40 /******************************************************************************
41  *    - creation d'un fichier MED
42  *    - ecriture des noeuds : coordonnees en mode MED_FULL_INTERLACE,
43  *                            noms,numeros,numeros de familles
44  *    - ecriture des familles d'un maillage MED 
45  *      2.0 via les routines de bas niveau
46  *    - fermeture du fichier
47  *****************************************************************************/
48
49 int main (int argc, char **argv)
50 {
51
52   /* Ecriture d'un premier maillage non structure (test14 + test8)
53     ************************************************************** */
54
55   med_err ret;
56   med_idt fid;
57   /* la dimension du maillage */
58   med_int mdim = 2;
59   /* nom du maillage de longueur maxi MED_TAILLE_NOM */
60   char maa[MED_TAILLE_NOM+1] = "maa1";
61   /* description du maillage de longueur maxi MED_TAIIL_DESC */
62   char maadesc[MED_TAILLE_DESC+1] = "Example de maillage structure 2D";
63   /* le nombre de noeuds */
64   med_int nnoe = 4;
65   /* table des coordonnees  
66      profil : (dimension * nombre de noeuds) */
67   med_float coo[8] = {0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0};
68   med_int nbr[2] = {2, 2};
69   /* tables des noms et des unites des coordonnees 
70      profil : (dimension*MED_TAILLE_PNOM+1) */
71   char nomcoo[2*MED_TAILLE_PNOM+1] = "x               y               ";
72   char unicoo[2*MED_TAILLE_PNOM+1] = "cm              cm              ";
73
74   char nomcooi[MED_TAILLE_PNOM+1] = "x               ";
75   char unicooi[MED_TAILLE_PNOM+1] = "cm              ";
76   /* tables des noms, numeros, numeros de familles des noeuds
77      autant d'elements que de noeuds - les noms ont pout longueur
78      MED_TAILLE_PNOM */
79   char nomnoe[4*MED_TAILLE_PNOM+1] = "nom1            nom2            nom3            nom4            ";
80   med_int numnoe[4] = {1,2,3,4};
81   med_int nufano[4] = {0,1,2,2};
82   char nomfam[MED_TAILLE_NOM+1];
83   med_int numfam;
84   char attdes[MED_TAILLE_DESC+1];
85   med_int natt;
86   med_int attide;
87   med_int attval;
88   med_int ngro;
89   char gro[MED_TAILLE_LNOM+1];
90   int i, ip1;
91   int nfame = 1; 
92   int nfamn = 2;
93   med_int famNodeStd[4];
94   med_int famElmtStd[1];
95   med_int famFaceStd[4];
96   med_int famNodeCart[16];
97   med_int famElmtCart[9];
98   med_int famFaceCart[24];
99   /*
100     les elements:
101   */
102   med_int nquad4 = 1;
103   med_int quad4[4] = {
104     1, 2, 4, 3
105   };
106   char nomquad4[MED_TAILLE_PNOM*1+1] = "quad1           ";
107   med_int numquad4[1] = {1};
108   med_int nufaquad4[1] = {-1};
109
110   fid = MEDouvrir("test19.med",MED_LECTURE_ECRITURE);
111   if (fid < 0)
112     ret = -1;
113   else
114     ret = 0;
115   printf("MEDouvrir : %d\n",ret);
116
117   /* creation du maillage maa de dimension 2 */
118   if (ret == 0)
119     ret = MEDmaaCr(fid,maa,mdim,MED_NON_STRUCTURE,maadesc);
120   printf("MEDmaaCr : %d\n",ret);
121
122   /* ecriture des noeuds d'un maillage MED : 
123      - des coo en mode MED_FULL_INTERLACE : (X1,Y1,X2,Y2,X3,Y3,...) 
124      dans un repere cartesien 
125      - des noms (optionnel dans un fichier MED) 
126      - des numeros (optionnel dans un fichier MED) 
127      - des numeros de familles des noeuds */          
128   if (ret == 0)
129     ret = MEDnoeudsEcr(fid,maa,mdim,coo,MED_FULL_INTERLACE,MED_CART,
130                        nomcoo,unicoo,nomnoe,MED_VRAI,numnoe,MED_VRAI,
131                        nufano,nnoe);
132   printf("MEDnoeudsEcr : %d\n",ret);
133
134   /* ecriture des mailles MED_QUAD4 :
135      - connectivite
136      - noms (optionnel) 
137      - numeros (optionnel)
138      - numeros des familles */
139   if (ret == 0) 
140     ret = MEDelementsEcr(fid,maa,mdim,quad4,MED_FULL_INTERLACE,
141                          nomquad4,MED_FAUX,numquad4,MED_VRAI,nufaquad4,nquad4,
142                          MED_MAILLE,MED_QUAD4,MED_NOD);
143   printf("MEDelementsEcr : %d\n",ret);
144
145   /* ecriture des familles */
146   /* Conventions :
147      - toujours creer une famille de numero 0 ne comportant aucun attribut
148      ni groupe (famille de reference pour les noeuds ou les elements
149      qui ne sont rattaches a aucun groupe ni attribut)
150      - les numeros de familles de noeuds sont > 0
151      - les numeros de familles des elements sont < 0
152      - rien d'imposer sur les noms de familles
153   */ 
154
155   /* la famille 0 */
156   if (ret == 0)
157     {
158       strcpy(nomfam,"FAMILLE_0");
159       numfam = 0;
160       ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,0,
161                      gro,0);
162     }
163   printf("MEDfamCr : %d \n",ret);
164
165   /* on cree pour correspondre aux cas tests precedents, 3 familles
166      d'elements (-1,-2,-3) et deux familles de noeuds (1,2) */
167   if (ret == 0)
168     {
169       nfame = 1;
170       for (i=0;i<nfame;i++)
171         {
172           if (ret == 0)
173             {
174               strcpy(nomfam,"FAMILLE_ELEMENT_");
175               numfam = -(i+1);
176               sprintf(nomfam,"%s%d",nomfam,-numfam);
177               attide = 1;
178               attval = numfam*100;
179               natt = 1;
180               strcpy(attdes,"description attribut");
181               strcpy(gro,"groupe1");
182               ngro = 1;
183               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
184                      ngro);
185               ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
186                              natt,gro,ngro);
187               printf("MEDfamCr (elements) : %d\n",ret);
188             }
189         }
190     }
191   
192   if (ret == 0)
193     {
194       nfamn = 2;
195       for (i=0;i<nfamn;i++)
196         {
197           if(ret == 0)
198             {
199               strcpy(nomfam,"FAMILLE_NOEUD_");
200               numfam = i+1;
201               sprintf(nomfam,"%s%d",nomfam,numfam);
202               attide = 1;
203               attval = numfam*100;
204               natt = 1;
205               strcpy(attdes,"description attribut");
206               strcpy(gro,"groupe1");
207               ngro = 1;
208               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
209                      ngro);
210               ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
211                              natt,gro,ngro);
212               printf("MEDfamCr (nodes) : %d\n",ret);
213             }
214         }
215     }
216
217
218   /* fermeture du fichier */
219   ret = MEDfermer(fid);
220   printf("MEDfermer : %d\n",ret);
221
222   /* Ecriture d'un deuxieme maillage structure : grille standard
223     ************************************************************* */
224
225   fid = MEDouvrir("test19.med", MED_LECTURE_ECRITURE);
226   if (fid < 0)
227     ret = -1;
228   else
229     ret = 0;
230   printf("MEDouvrir : %d\n",ret);
231
232   strcpy(maa, "Grille Standard");
233   strcpy(maadesc, "Example de maillage structure grille standard 2D");
234   /* creation du maillage grille standard maa de dimension 2 */
235   if (ret == 0)
236     ret = MEDmaaCr(fid, maa, mdim, MED_STRUCTURE, maadesc);
237   printf("MEDmaaCr : %d\n",ret);
238
239   if (ret == 0)
240     ret = MEDnatureGrilleEcr(fid, maa, MED_GRILLE_STANDARD);
241   printf("MEDnatureGrilleEcr : %d\n",ret);
242
243   /* ecriture des noeuds d'un maillage MED : 
244      - des coo en mode MED_FULL_INTERLACE : (X1,Y1,X2,Y2,X3,Y3,...) 
245      dans un repere cartesien 
246      - des noms (optionnel dans un fichier MED) 
247      - des numeros (optionnel dans un fichier MED) 
248      - des numeros de familles des noeuds */          
249 /*   if (ret == 0) */
250 /*     ret = MEDstructureCoordEcr(fid,maa,mdim,nbr); */
251 /*   printf("MEDstructureCoordEcr : %d\n",ret); */
252
253   if (ret == 0)
254     ret = MEDcoordEcr(fid,maa,mdim,coo,MED_FULL_INTERLACE,nnoe,MED_CART,
255                       nomcoo,unicoo);
256   printf("MEDcoordEcr : %d\n",ret);
257
258   if (ret == 0)
259     ret = MEDstructureCoordEcr(fid,maa,mdim,nbr);
260   printf("MEDstructureCoordEcr : %d\n",ret);
261
262   /* Ecriture des familles de la grille standard */
263
264   /* les noeuds */
265
266   if (ret == 0) {
267     famNodeStd[ 0]=1; famNodeStd[ 1]=1;
268     famNodeStd[ 2]=2; famNodeStd[ 3]=2;
269
270     ret = MEDfamEcr(fid, maa, famNodeStd, 4, MED_NOEUD, 0);
271   };
272   printf("MEDfamEcr for Nodes : %d\n",ret);
273
274   /* les elements */
275
276   if (ret == 0) {
277     famElmtStd[ 0]=0;
278
279     ret = MEDfamEcr(fid, maa, famElmtStd, 1, MED_MAILLE, MED_QUAD4);
280   };
281   printf("MEDfamEcr for Elements : %d\n",ret);
282
283   /* les faces/edges */
284
285   if (ret == 0) {
286     for (i=0; i<4; i++) famFaceStd[i]=0;
287
288     ret = MEDfamEcr(fid, maa, famFaceStd, 4, MED_ARETE, MED_SEG2);
289   };
290   printf("MEDfamEcr for Elements : %d\n",ret);
291
292   /* la famille 0 */
293   if (ret == 0)
294     {
295       strcpy(nomfam,"FAMILLE_0");
296       numfam = 0;
297       ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,0,
298                      gro,0);
299     }
300   printf("MEDfamCr : %d\n",ret);
301
302   if (ret == 0)
303     {
304       nfamn = 2;
305       for (i=0;i<nfamn;i++)
306         {
307           if(ret == 0)
308             {
309               strcpy(nomfam,"FAMILLE_NOEUD_");
310               numfam = i+1;
311               sprintf(nomfam,"%s%d",nomfam,numfam);
312               attide = 1;
313               attval = numfam*100;
314               natt = 1;
315               strcpy(attdes,"description attribut");
316               strcpy(gro,"groupe1");
317               ngro = 1;
318               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
319                      ngro);
320               ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
321                              natt,gro,ngro);
322               printf("MEDfamCr (nodes) : %d\n",ret);
323             }
324         }
325     }
326
327   /* fermeture du fichier */
328   ret = MEDfermer(fid);
329   printf("MEDfermer : %d\n",ret);
330
331   /* Ecriture d'un troisieme maillage structure : grille cartesienne
332     *************************************************************** */
333
334   fid = MEDouvrir("test19.med", MED_LECTURE_ECRITURE);
335   if (fid < 0)
336     ret = -1;
337   else
338     ret = 0;
339   printf("MEDouvrir : %d\n",ret);
340
341   strcpy(maa, "Grille Cartesienne");
342   strcpy(maadesc, "Example de maillage structure grille cartesienne 2D");
343   /* creation d'une grille cartesienne maa de dimension 2 */
344   if (ret == 0)
345     ret = MEDmaaCr(fid, maa, mdim, MED_STRUCTURE, maadesc);
346   printf("MEDmaaCr : %d\n",ret);
347
348   if (ret == 0)
349     ret = MEDnatureGrilleEcr(fid, maa, MED_GRILLE_CARTESIENNE);
350   printf("MEDnatureGrilleEcr : %d\n",ret);
351
352   /* Ecriture des indices de la grille cartesienne :
353      - des coo en mode MED_FULL_INTERLACE : (X1,Y1,X2,Y2,X3,Y3,...) */
354   for (i=0; i<mdim; i++) {
355     ip1 = i + 1;
356     coo[0] = 1.1+i;
357     coo[1] = 1.2+i;
358     coo[2] = 1.3+i;
359     coo[3] = 1.4+i;
360     if (ret == 0) {
361       ret = MEDindicesCoordEcr(fid, maa, mdim, coo, nnoe, ip1,
362                                nomcooi, unicooi);
363     };
364   };
365   printf("MEDindicesCoordEcr : %d\n",ret);
366
367   /* Ecriture des familles de la grille cartesienne */
368
369   /* les noeuds */
370
371   if (ret == 0) {
372     famNodeCart[ 0]=3; famNodeCart[ 1]=3; famNodeCart[ 2]=2; famNodeCart[ 3]=1;
373     famNodeCart[ 4]=7; famNodeCart[ 5]=8; famNodeCart[ 6]=2; famNodeCart[ 7]=4;
374     famNodeCart[ 8]=2; famNodeCart[ 9]=9; famNodeCart[10]=0; famNodeCart[11]=2;
375     famNodeCart[12]=5; famNodeCart[13]=5; famNodeCart[14]=6; famNodeCart[15]=7;
376
377     ret = MEDfamEcr(fid, maa, famNodeCart, 16, MED_NOEUD, 0);
378   };
379   printf("MEDfamEcr for Nodes : %d\n",ret);
380
381   /* les elements */
382
383   if (ret == 0) {
384     for(i=0; i<9; i++) famElmtCart[i]=0;
385
386     ret = MEDfamEcr(fid, maa, famElmtCart, 9, MED_MAILLE, MED_QUAD4);
387   };
388   printf("MEDfamEcr for Elements : %d\n",ret);
389
390   /* les faces/edges */
391
392   if (ret == 0) {
393     for(i=0; i<24; i++) famFaceCart[i]=0;
394
395     ret = MEDfamEcr(fid, maa, famFaceCart, 24, MED_ARETE, MED_SEG2);
396   };
397   printf("MEDfamEcr for Elements : %d\n",ret);
398
399   /* la famille 0 */
400   if (ret == 0)
401     {
402       strcpy(nomfam,"FAMILLE_0");
403       numfam = 0;
404       ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,0,
405                      gro,0);
406     }
407   printf("MEDfamCr : %d \n",ret);
408
409   if (ret == 0)
410     {
411       nfamn = 9;
412       for (i=0;i<nfamn;i++)
413         {
414           if(ret == 0)
415             {
416               strcpy(nomfam,"FAMILLE_NOEUD_");
417               numfam = i+1;
418               sprintf(nomfam,"%s%d",nomfam,numfam);
419               attide = 1;
420               attval = numfam*100;
421               natt = 1;
422               strcpy(attdes,"description attribut");
423               strcpy(gro,"groupe1");
424               ngro = 1;
425               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
426                      ngro);
427               ret = MEDfamCr(fid,maa,nomfam,numfam,&attide,&attval,attdes,
428                              natt,gro,ngro);
429               printf("MEDfamCr (nodes) : %d\n",ret);
430             }
431         }
432     }
433
434   /* fermeture du fichier */
435   ret = MEDfermer(fid);
436   printf("MEDfermer : %d\n",ret);
437
438   if ( getenv("srcdir") ) {
439     /* we are in 'make check' */
440     remove( "test19.med" );
441     printf("Remove generated file");
442   }
443
444   return 0;
445 }