Back to index

salome-med  6.5.0
create_grid.c
Go to the documentation of this file.
00001 // Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
00002 //
00003 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
00004 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
00005 //
00006 // This library is free software; you can redistribute it and/or
00007 // modify it under the terms of the GNU Lesser General Public
00008 // License as published by the Free Software Foundation; either
00009 // version 2.1 of the License.
00010 //
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 //
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
00019 //
00020 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
00021 //
00022 
00023 /*----------------------------------------------------------------------------
00024   MED MEDMEM : MED files in memory
00025 
00026   File   : create_grid.c
00027   Module : MED
00028 ----------------------------------------------------------------------------*/
00029 
00030 /******************************************************************************
00031  * - Nom du fichier : test19.c
00032  *
00033  * - Description : ecriture des objets MED relatifs aux grilles
00034  *                 MED V2.0
00035  *
00036  *****************************************************************************/
00037 
00038 #include <med.h>
00039 #include <string.h>
00040 #include <stdlib.h>
00041 
00042 /******************************************************************************
00043  *    - creation d'un fichier MED
00044  *    - ecriture des noeuds : coordonnees en mode MED_FULL_INTERLACE,
00045  *                            noms,numeros,numeros de familles
00046  *    - ecriture des familles d'un maillage MED 
00047  *      2.0 via les routines de bas niveau
00048  *    - fermeture du fichier
00049  *****************************************************************************/
00050 
00051 int main (int argc, char **argv)
00052 {
00053 
00054   /* Ecriture d'un premier maillage non structure (test14 + test8)
00055     ************************************************************** */
00056 
00057   med_err ret;
00058   med_idt fid;
00059   /* la dimension du maillage */
00060   med_int mdim = 2;
00061   /* nom du maillage de longueur maxi MED_TAILLE_NOM */
00062   char maa[MED_NAME_SIZE+1] = "maa1";
00063   /* description du maillage de longueur maxi MED_TAIIL_DESC */
00064   char maadesc[MED_COMMENT_SIZE+1] = "Example de maillage structure 2D";
00065   /* le nombre de noeuds */
00066   med_int nnoe = 4;
00067   /* table des coordonnees  
00068      profil : (dimension * nombre de noeuds) */
00069   med_float coo[8] = {0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0};
00070   med_int nbr[2] = {2, 2};
00071   /* tables des noms et des unites des coordonnees 
00072      profil : (dimension*MED_TAILLE_PNOM+1) */
00073   char nomcoo[2*MED_SNAME_SIZE+1] = "x               y               ";
00074   char unicoo[2*MED_SNAME_SIZE+1] = "cm              cm              ";
00075 
00076   char nomcooi[MED_SNAME_SIZE+1] = "x               ";
00077   char unicooi[MED_SNAME_SIZE+1] = "cm              ";
00078   /* tables des noms, numeros, numeros de familles des noeuds
00079      autant d'elements que de noeuds - les noms ont pout longueur
00080      MED_SNAME_SIZE */
00081 //   char nomnoe[4*MED_SNAME_SIZE+1] = "nom1            nom2            nom3            nom4            ";
00082 //  med_int numnoe[4] = {1,2,3,4};
00083   med_int nufano[4] = {0,1,2,2};
00084   char nomfam[MED_NAME_SIZE+1];
00085   med_int numfam;
00086   //char attdesMED_TAILLE_DESC+1];
00087   med_int natt;
00088   med_int attide;
00089   med_int attval;
00090   med_int ngro;
00091   char gro[MED_LNAME_SIZE+1];
00092   char dtunitp3[MED_LNAME_SIZE+1]="";
00093   int i, ip1;
00094   int nfame = 1; 
00095   int nfamn = 2;
00096   med_int famNodeStd[4];
00097   med_int famElmtStd[1];
00098   med_int famFaceStd[4];
00099   med_int famNodeCart[16];
00100   med_int famElmtCart[9];
00101   med_int famFaceCart[24];
00102   /*
00103     les elements:
00104   */
00105   med_int nquad4 = 1;
00106   med_int quad4[4] = {
00107     1, 2, 4, 3
00108   };
00109  // char nomquad4[MED_SNAME_SIZE*1+1] = "quad1           ";
00110  // med_int numquad4[1] = {1};
00111   med_int nufaquad4[1] = {-1};
00112 
00113   fid = MEDfileOpen("test19.med",MED_ACC_RDWR);
00114   if (fid < 0)
00115     ret = -1;
00116   else
00117     ret = 0;
00118   printf("MEDouvrir : %d\n",ret);
00119 
00120   /* creation du maillage maa de dimension 2 */
00121   if (ret == 0)
00122     ret = MEDmeshCr(fid,maa,mdim,mdim,MED_UNSTRUCTURED_MESH,maadesc,dtunitp3,
00123                     MED_SORT_DTIT,MED_CARTESIAN,nomcoo,unicoo);
00124   printf("MEDmaaCr : %d\n",ret);
00125 
00126   /* ecriture des noeuds d'un maillage MED : 
00127      - des coo en mode MED_FULL_INTERLACE : (X1,Y1,X2,Y2,X3,Y3,...) 
00128      dans un repere cartesien 
00129      - des noms (optionnel dans un fichier MED) 
00130      - des numeros (optionnel dans un fichier MED) 
00131      - des numeros de familles des noeuds */          
00132   if (ret == 0)
00133     ret = MEDmeshNodeCoordinateWr(fid,maa,MED_NO_DT,MED_NO_IT,MED_NO_DT,MED_FULL_INTERLACE,nnoe,coo);
00134   MEDmeshEntityFamilyNumberWr(fid,maa,MED_NO_DT,MED_NO_IT,MED_NODE,0,nnoe,nufano);
00135   printf("MEDnoeudsEcr : %d\n",ret);
00136 
00137   /* ecriture des mailles MED_QUAD4 :
00138      - connectivite
00139      - noms (optionnel) 
00140      - numeros (optionnel)
00141      - numeros des familles */
00142   if (ret == 0) 
00143     ret = MEDmeshElementConnectivityWr(fid,maa,MED_NO_DT,MED_NO_IT,MED_NO_DT,
00144                                        MED_CELL,MED_QUAD4,MED_NODAL,MED_FULL_INTERLACE,
00145                                        nquad4,quad4);
00146   MEDmeshEntityFamilyNumberWr(fid,maa,MED_NO_DT,MED_NO_IT,MED_CELL,MED_QUAD4,nquad4,nufaquad4);
00147   printf("MEDelementsEcr : %d\n",ret);
00148 
00149   /* ecriture des familles */
00150   /* Conventions :
00151      - toujours creer une famille de numero 0 ne comportant aucun attribut
00152      ni groupe (famille de reference pour les noeuds ou les elements
00153      qui ne sont rattaches a aucun groupe ni attribut)
00154      - les numeros de familles de noeuds sont > 0
00155      - les numeros de familles des elements sont < 0
00156      - rien d'imposer sur les noms de familles
00157   */ 
00158 
00159   /* la famille 0 */
00160   if (ret == 0)
00161     {
00162       strcpy(nomfam,"FAMILLE_0");
00163       numfam = 0;
00164       ret = MEDfamilyCr(fid,maa,nomfam,numfam,0,gro);
00165     }
00166   printf("MEDfamCr : %d \n",ret);
00167 
00168   /* on cree pour correspondre aux cas tests precedents, 3 familles
00169      d'elements (-1,-2,-3) et deux familles de noeuds (1,2) */
00170   if (ret == 0)
00171     {
00172       nfame = 1;
00173       for (i=0;i<nfame;i++)
00174         {
00175           if (ret == 0)
00176             {
00177               strcpy(nomfam,"FAMILLE_ELEMENT_");
00178               numfam = -(i+1);
00179               sprintf(nomfam,"%s%d",nomfam,-numfam);
00180               attide = 1;
00181               attval = numfam*100;
00182               natt = 1;
00183               //strcpy(attdes,"description attribut");
00184               strcpy(gro,"groupe1");
00185               ngro = 1;
00186               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
00187                      ngro);
00188               ret = MEDfamilyCr(fid,maa,nomfam,numfam,ngro,gro);
00189               printf("MEDfamCr (elements) : %d\n",ret);
00190             }
00191         }
00192     }
00193   
00194   if (ret == 0)
00195     {
00196       nfamn = 2;
00197       for (i=0;i<nfamn;i++)
00198         {
00199           if(ret == 0)
00200             {
00201               strcpy(nomfam,"FAMILLE_NOEUD_");
00202               numfam = i+1;
00203               sprintf(nomfam,"%s%d",nomfam,numfam);
00204               attide = 1;
00205               attval = numfam*100;
00206               natt = 1;
00207               //strcpy(attdes,"description attribut");
00208               strcpy(gro,"groupe1");
00209               ngro = 1;
00210               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
00211                      ngro);
00212               ret = MEDfamilyCr(fid,maa,nomfam,numfam,ngro,gro);
00213               printf("MEDfamCr (nodes) : %d\n",ret);
00214             }
00215         }
00216     }
00217 
00218 
00219   /* fermeture du fichier */
00220   ret = MEDfermer(fid);
00221   printf("MEDfermer : %d\n",ret);
00222 
00223   /* Ecriture d'un deuxieme maillage structure : grille standard
00224     ************************************************************* */
00225 
00226   fid = MEDfileOpen("test19.med", MED_ACC_RDWR);
00227   if (fid < 0)
00228     ret = -1;
00229   else
00230     ret = 0;
00231   printf("MEDouvrir : %d\n",ret);
00232 
00233   strcpy(maa, "Grille Standard");
00234   strcpy(maadesc, "Example de maillage structure grille standard 2D");
00235   /* creation du maillage grille standard maa de dimension 2 */
00236   if (ret == 0)
00237     ret = MEDmeshCr(fid,maa,mdim,mdim,MED_STRUCTURED_MESH,maadesc,dtunitp3,
00238                     MED_SORT_DTIT,MED_CARTESIAN,nomcoo,unicoo);
00239   printf("MEDmaaCr : %d\n",ret);
00240 
00241   if (ret == 0)
00242     ret = MEDmeshGridTypeWr(fid, maa, MED_CARTESIAN_GRID);
00243   printf("MEDnatureGrilleEcr : %d\n",ret);
00244 
00245   /* ecriture des noeuds d'un maillage MED : 
00246      - des coo en mode MED_FULL_INTERLACE : (X1,Y1,X2,Y2,X3,Y3,...) 
00247      dans un repere cartesien 
00248      - des noms (optionnel dans un fichier MED) 
00249      - des numeros (optionnel dans un fichier MED) 
00250      - des numeros de familles des noeuds */          
00251 /*   if (ret == 0) */
00252 /*     ret = MEDstructureCoordEcr(fid,maa,mdim,nbr); */
00253 /*   printf("MEDstructureCoordEcr : %d\n",ret); */
00254 
00255   if (ret == 0)
00256     ret = MEDmeshNodeCoordinateWr(fid,maa,MED_NO_DT,MED_NO_IT,MED_NO_DT,MED_FULL_INTERLACE,nnoe,coo);
00257   printf("MEDcoordEcr : %d\n",ret);
00258 
00259   if (ret == 0)
00260     ret = MEDmeshGridStructWr(fid,maa,MED_NO_DT,MED_NO_IT,MED_NO_DT,nbr);
00261   printf("MEDstructureCoordEcr : %d\n",ret);
00262 
00263   /* Ecriture des familles de la grille standard */
00264 
00265   /* les noeuds */
00266 
00267   if (ret == 0) {
00268     famNodeStd[ 0]=1; famNodeStd[ 1]=1;
00269     famNodeStd[ 2]=2; famNodeStd[ 3]=2;
00270 
00271     ret = MEDfamEcr(fid, maa, MED_NO_DT,MED_NO_IT,MED_NODE, 0, 4, famNodeStd);
00272   };
00273   printf("MEDfamEcr for Nodes : %d\n",ret);
00274 
00275   /* les elements */
00276 
00277   if (ret == 0) {
00278     famElmtStd[ 0]=0;
00279 
00280     ret = MEDfamEcr(fid, maa, MED_NO_DT,MED_NO_IT,MED_CELL, MED_QUAD4, 1, famElmtStd);
00281   };
00282   printf("MEDfamEcr for Elements : %d\n",ret);
00283 
00284   /* les faces/edges */
00285 
00286   if (ret == 0) {
00287     for (i=0; i<4; i++) famFaceStd[i]=0;
00288 
00289     ret = MEDfamEcr(fid, maa, MED_NO_DT,MED_NO_IT,MED_CELL, MED_SEG2, 4, famFaceStd);
00290   };
00291   printf("MEDfamEcr for Elements : %d\n",ret);
00292 
00293   /* la famille 0 */
00294   if (ret == 0)
00295     {
00296       strcpy(nomfam,"FAMILLE_0");
00297       numfam = 0;
00298       ret = MEDfamilyCr(fid,maa,nomfam,numfam,0,gro);
00299     }
00300   printf("MEDfamCr : %d\n",ret);
00301 
00302   if (ret == 0)
00303     {
00304       nfamn = 2;
00305       for (i=0;i<nfamn;i++)
00306         {
00307           if(ret == 0)
00308             {
00309               strcpy(nomfam,"FAMILLE_NOEUD_");
00310               numfam = i+1;
00311               sprintf(nomfam,"%s%d",nomfam,numfam);
00312               attide = 1;
00313               attval = numfam*100;
00314               natt = 1;
00315               //strcpy(attdes,"description attribut");
00316               strcpy(gro,"groupe1");
00317               ngro = 1;
00318               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
00319                      ngro);
00320               ret = MEDfamilyCr(fid,maa,nomfam,numfam,ngro,gro);
00321               printf("MEDfamCr (nodes) : %d\n",ret);
00322             }
00323         }
00324     }
00325 
00326   /* fermeture du fichier */
00327   ret = MEDfermer(fid);
00328   printf("MEDfermer : %d\n",ret);
00329 
00330   /* Ecriture d'un troisieme maillage structure : grille cartesienne
00331     *************************************************************** */
00332 
00333   fid = MEDfileOpen("test19.med", MED_ACC_RDWR);
00334   if (fid < 0)
00335     ret = -1;
00336   else
00337     ret = 0;
00338   printf("MEDouvrir : %d\n",ret);
00339 
00340   strcpy(maa, "Grille Cartesienne");
00341   strcpy(maadesc, "Example de maillage structure grille cartesienne 2D");
00342   /* creation d'une grille cartesienne maa de dimension 2 */
00343   if (ret == 0)
00344     ret = MEDmeshCr(fid,maa,mdim,mdim,MED_STRUCTURED_MESH,maadesc,dtunitp3,
00345                     MED_SORT_DTIT,MED_CARTESIAN,nomcoo,unicoo);
00346   printf("MEDmaaCr : %d\n",ret);
00347 
00348   if (ret == 0)
00349     ret = MEDmeshGridTypeWr(fid, maa, MED_CARTESIAN_GRID);
00350   printf("MEDnatureGrilleEcr : %d\n",ret);
00351 
00352   /* Ecriture des indices de la grille cartesienne :
00353      - des coo en mode MED_FULL_INTERLACE : (X1,Y1,X2,Y2,X3,Y3,...) */
00354   for (i=0; i<mdim; i++) {
00355     ip1 = i + 1;
00356     coo[0] = 1.1+i;
00357     coo[1] = 1.2+i;
00358     coo[2] = 1.3+i;
00359     coo[3] = 1.4+i;
00360     if (ret == 0) {
00361       ret = MEDindicesCoordEcr(fid, maa, mdim, coo, nnoe, ip1,
00362                                nomcooi, unicooi);
00363     };
00364   };
00365   printf("MEDindicesCoordEcr : %d\n",ret);
00366 
00367   /* Ecriture des familles de la grille cartesienne */
00368 
00369   /* les noeuds */
00370 
00371   if (ret == 0) {
00372     famNodeCart[ 0]=3; famNodeCart[ 1]=3; famNodeCart[ 2]=2; famNodeCart[ 3]=1;
00373     famNodeCart[ 4]=7; famNodeCart[ 5]=8; famNodeCart[ 6]=2; famNodeCart[ 7]=4;
00374     famNodeCart[ 8]=2; famNodeCart[ 9]=9; famNodeCart[10]=0; famNodeCart[11]=2;
00375     famNodeCart[12]=5; famNodeCart[13]=5; famNodeCart[14]=6; famNodeCart[15]=7;
00376 
00377     ret = MEDfamEcr(fid, maa, famNodeCart, 16, MED_NODE, 0);
00378   };
00379   printf("MEDfamEcr for Nodes : %d\n",ret);
00380 
00381   /* les elements */
00382 
00383   if (ret == 0) {
00384     for(i=0; i<9; i++) famElmtCart[i]=0;
00385 
00386     ret = MEDfamEcr(fid, maa, MED_NO_DT,MED_NO_IT,MED_CELL, MED_QUAD4, 9, famElmtCart);
00387   };
00388   printf("MEDfamEcr for Elements : %d\n",ret);
00389 
00390   /* les faces/edges */
00391 
00392   if (ret == 0) {
00393     for(i=0; i<24; i++) famFaceCart[i]=0;
00394 
00395     ret = MEDfamEcr(fid, maa, MED_NO_DT,MED_NO_IT, MED_CELL, MED_SEG2, 24, famFaceCart);
00396   };
00397   printf("MEDfamEcr for Elements : %d\n",ret);
00398 
00399   /* la famille 0 */
00400   if (ret == 0)
00401     {
00402       strcpy(nomfam,"FAMILLE_0");
00403       numfam = 0;
00404       ret = MEDfamilyCr(fid,maa,nomfam,numfam,0,gro);
00405     }
00406   printf("MEDfamCr : %d \n",ret);
00407 
00408   if (ret == 0)
00409     {
00410       nfamn = 9;
00411       for (i=0;i<nfamn;i++)
00412         {
00413           if(ret == 0)
00414             {
00415               strcpy(nomfam,"FAMILLE_NOEUD_");
00416               numfam = i+1;
00417               sprintf(nomfam,"%s%d",nomfam,numfam);
00418               attide = 1;
00419               attval = numfam*100;
00420               natt = 1;
00421               //strcpy(attdes,"description attribut");
00422               strcpy(gro,"groupe1");
00423               ngro = 1;
00424               printf("%s - %d - %d - %d - %d \n",nomfam,numfam,attide,attval,
00425                      ngro);
00426               ret = MEDfamilyCr(fid,maa,nomfam,numfam,ngro,gro);
00427               printf("MEDfamCr (nodes) : %d\n",ret);
00428             }
00429         }
00430     }
00431 
00432   /* fermeture du fichier */
00433   ret = MEDfermer(fid);
00434   printf("MEDfermer : %d\n",ret);
00435 
00436   if ( getenv("srcdir") ) {
00437     /* we are in 'make check' */
00438     remove( "test19.med" );
00439     printf("Remove generated file");
00440   }
00441 
00442   return 0;
00443 }