Salome HOME
Mantis issue 0021668: [CEA 564] MED2.1 to MED2.3
[modules/med.git] / src / MEDWrapper / V2_1 / Core / MEDbodyFittedEcr.cxx
1 /*************************************************************************
2 * COPYRIGHT (C) 1999 - 2002  EDF R&D
3 * THIS LIBRARY IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
4 * IT UNDER THE TERMS OF THE GNU LESSER GENERAL PUBLIC LICENSE 
5 * AS PUBLISHED BY THE FREE SOFTWARE FOUNDATION; 
6 * EITHER VERSION 2.1 OF THE LICENSE, OR (AT YOUR OPTION) ANY LATER VERSION.
7 *  
8 * THIS LIBRARY IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL, BUT
9 * WITHOUT ANY WARRANTY; WITHOUT EVEN THE IMPLIED WARRANTY OF
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. SEE THE GNU
11 * LESSER GENERAL PUBLIC LICENSE FOR MORE DETAILS.
12 *
13 * YOU SHOULD HAVE RECEIVED A COPY OF THE GNU LESSER GENERAL PUBLIC LICENSE
14 * ALONG WITH THIS LIBRARY; IF NOT, WRITE TO THE FREE SOFTWARE FOUNDATION,
15 * INC., 59 TEMPLE PLACE, SUITE 330, BOSTON, MA 02111-1307 USA
16 *
17 *************************************************************************/
18
19 #include "med_outils.hxx"
20 #include "med.hxx"
21
22 #include <cstring>
23
24 #if defined(HAVE_F77INT64)
25 #define MED_INTEGER MED_INT64
26 #else
27 #define MED_INTEGER MED_INT32
28 #endif
29
30 namespace med_2_1{
31
32 med_err 
33 MEDbodyFittedEcr(med_idt fid, char *maa, med_int mdim, med_float *coo, med_int *nbr, med_mode_switch mode_coo,
34                  med_repere repere, char *nomcoo, char *unicoo, med_int *fam, med_int nnoeuds, med_mode_acces mode )
35 {
36     /* ecriture des coordonnees */
37     med_idt   maaid, noeid, dataset;
38     med_size dimd[1];
39     char     chemin[MED_TAILLE_MAA+MED_TAILLE_NOM+1];
40     med_int  type_rep_int;
41     int      d;
42     char     *ds;
43
44     /* On inhibe le gestionnaire d'erreur HDF */
45     _MEDmodeErreurVerrouiller();
46
47     /* Si le maillage n'existe pas => erreur */
48     strcpy(chemin, MED_MAA);
49     strcat(chemin, maa);
50     if ((maaid = _MEDdatagroupOuvrir(fid, chemin)) < 0) {
51         return(-1);
52     };
53
54     /* Si le Data Group "NOE" n'existe pas on le cree */
55     if ((noeid = _MEDdatagroupOuvrir(maaid, MED_NOM_NOE)) < 0) {
56         if ((noeid = _MEDdatagroupCreer(maaid, MED_NOM_NOE)) < 0) {
57             return(-1);
58         };
59     };
60
61     /* Creation du Data Set "BOF" */
62     dimd[0] = nnoeuds*mdim;
63     if (_MEDdatasetNumEcrire(noeid, MED_NOM_BOF, MED_REEL64, mode_coo, mdim, MED_ALL, MED_NOPF, 0, 0, dimd, (unsigned char*)coo, mode) < 0) {
64         return(-1);
65     };
66   
67     /* On re-ouvre le Data Set "BOF" pour y placer des attributs */
68     if ((dataset = _MEDdatasetOuvrir(noeid, MED_NOM_BOF)) < 0) {
69         return(-1);
70     };
71
72     /* Attribut NBR (nombre de noeuds) */
73     if (_MEDattrEntierEcrire(dataset, MED_NOM_NBR, &nnoeuds, mode) < 0) {
74         return(-1);
75     };
76
77     /* L'attribut "REP" */
78     type_rep_int = (med_int)repere;
79     if (_MEDattrEntierEcrire(dataset, MED_NOM_REP, &type_rep_int, mode) < 0) {
80         return(-1);
81     };
82
83     /* Attribut "NOM" */
84     if (_MEDattrStringEcrire(dataset, MED_NOM_NOM, mdim*MED_TAILLE_PNOM, nomcoo, mode) < 0) {
85         return(-1);
86     };
87
88     /* Attribut "UNI" */
89     if (_MEDattrStringEcrire(dataset, MED_NOM_UNI, mdim*MED_TAILLE_PNOM, unicoo, mode) < 0) {
90         return(-1);
91     };
92
93     if (_MEDdatasetFermer(dataset) < 0) return(-1);
94
95     dimd[0] = 1;
96     for (d=0; d<mdim; d++) {
97         switch (d) {
98             case 0 : {
99                 ds = MED_NOM_IN1;
100                 break;
101             };
102             case 1 : {
103                 ds = MED_NOM_IN2;
104                 break;
105             };
106             case 2 : {
107                 ds = MED_NOM_IN3;
108                 break;
109             };
110             default : {
111                 return(-1);
112             };
113         };
114
115         /* Creation du Data Set "IN1", "IN2", "IN3" contenant la taille du bodyfitted sur cette dimension */
116         if (_MEDdatasetNumEcrire(noeid, ds, MED_INTEGER, mode_coo, MED_DIM1, MED_ALL, MED_NOPF, 0, 0, dimd, (unsigned char*)&nbr[d], mode) < 0) {
117             return(-1);
118         };
119
120         /* On re-ouvre ce Data Set pour y placer des attributs */
121         if ((dataset = _MEDdatasetOuvrir(noeid, ds)) < 0) {
122             return(-1);
123         };
124
125         /* Attribut NBR (nombre de noeuds dans l'une des dimensions) */
126         if (_MEDattrEntierEcrire(dataset, MED_NOM_NBR, &nbr[d], mode) < 0) {
127             return(-1);
128         };
129
130         if (_MEDdatasetFermer(dataset) < 0) return(-1);
131     };
132
133     /* Ecriture des numeros de familles */
134     if (MEDfamEcr(fid, maa, fam, nnoeuds, mode, MED_NOEUD, MED_POINT1) < 0) {
135         return(-1);
136     };
137
138     /* On ferme tout */
139     if (_MEDdatagroupFermer(noeid) < 0) return(-1);
140     if (_MEDdatagroupFermer(maaid) < 0) return(-1);
141     return(0);
142 }
143
144 }