1 /*  This file is part of MED.
2  *
3  *  COPYRIGHT (C) 1999 - 2019  EDF R&D, CEA/DEN
4  *  MED is free software: you can redistribute it and/or modify
5  *  it under the terms of the GNU Lesser General Public License as published by
6  *  the Free Software Foundation, either version 3 of the License, or
7  *  (at your option) any later version.
8  *
9  *  MED is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with MED.  If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 
19 #include <med.h>
20 #include <med_config.h>
21 #include <med_outils.h>
22 #include <string.h>
23 #include <stdlib.h>
24 
25 /**\ingroup MEDmesh
26    \brief \MEDmeshNodeCoordinateAdvancedWrBrief
27    \param fid \fid
28    \param meshname \meshname
29    \param numdt \numdt
30    \param numit \numit
31    \param dt \dt
32    \param filter \filter
33    \param coordinate \coordinate
34    \retval med_err \error
35    \details \MEDmeshNodeCoordinateAdvancedWrDetails
36    \remarks
37    \MEDmeshNodeCoordinateWrnogridRem
38    \see MEDmeshNodeCoordinateWr
39    \see MEDmeshNodeCoordinateWithProfileWr
40 */
41 
MEDmeshNodeCoordinateAdvancedWr(const med_idt fid,const char * const meshname,const med_int numdt,const med_int numit,const med_float dt,const med_filter * const filter,const med_float * const coordinate)42 med_err MEDmeshNodeCoordinateAdvancedWr(const med_idt               fid,
43 					const char*  const          meshname,
44 					const med_int               numdt,
45 					const med_int               numit,
46 					const med_float             dt,
47 					const med_filter * const    filter,
48 					const med_float* const      coordinate)
49 {
50   med_err         _ret         = -1;
51   med_idt         _meshid      = 0,_datagroup1=0,_datagroup_trsf=0;
52   med_idt         _dataset_trsf = 0;
53   med_int         _intmeshtype = 0;
54   char            _meshpath   [MED_MESH_SUPPORT_GRP_SIZE+MED_NAME_SIZE+1]="";
55   char            _datagroup_trsfname[MED_TAILLE_NOM_ENTITE+MED_TAILLE_COOTRF+1]=MED_NOM_NOE MED_COOTRF;
56   med_bool        _isasupportmesh=MED_FALSE,_isasoftlink=MED_FALSE;
57 
58 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
59 
60   /* Maillage de calcul ou maillage support */
61   if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
62     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
63     SSCRUTE(_meshpath); goto ERROR;
64   }
65 
66   /* Lecture de l'attribut du type de maillage MED_NOM_TYP  */
67   if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
68     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
69     SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
70   }
71 
72   if ( _isasupportmesh ) {
73     if (( numdt != MED_NO_DT) && (numit != MED_NO_IT) ) {
74       MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_PARAMETER,MED_ERR_MESH_MSG);
75       SSCRUTE(meshname);ISCRUTE(numdt);ISCRUTE(numit);goto ERROR;
76     }
77   } else
78     if ( (_datagroup1 =_MEDmeshAssociatedGroupCr(fid, MED_MESH_GRP,
79 						 meshname, numdt, numit, dt, MED_FALSE,
80 					       "." ) ) < 0 ) {
81       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDmeshAssociatedGroupCr");
82       goto ERROR;
83   }
84 
85 
86   /*Réinitialisation du lien MED_TRSF_NOM/MED_COORDINATE_TRSF s'il existe */
87   /*Si un dataset de transformation existe une erreur est générée par
88     _MEDsoftlinkDel */
89   /*Réinitialisation du lien MED_TRSF_NOM/MED_COORDINATE_TRSF s'il existe */
90   /*Si un dataset de transformation existe une erreur est générée par
91     _MEDsoftlinkDel */
92   if ( !_isasupportmesh)
93     if ((_datagroup_trsf = _MEDdatagroupOuvrir(_datagroup1,_datagroup_trsfname)) > 0) {
94 
95       if ( _MEDisasoftlink(_datagroup_trsf, MED_NOM_TRF,MED_FALSE, &_isasoftlink ) < 0 ) {
96 	MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_LINK,MED_NOM_COO);
97 	goto ERROR;
98       }
99       if (_isasoftlink ) {
100 	if (  _MEDsoftlinkDel(_datagroup_trsf,
101 			      MED_NOM_TRF,
102 			      MED_TRUE) < 0 ) {
103 	  MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDsoftlinkDel");
104 	  goto ERROR;
105 	}
106       } else {
107 	if ( (_dataset_trsf = _MEDdatasetOuvrir(_datagroup_trsf,MED_NOM_TRF)) >= 0 ) {
108 	  _MEDdatasetFermer(_dataset_trsf);
109 	  MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_DATASET,MED_NOM_TRF);
110 	  goto ERROR;
111 	}
112 
113       }
114     }
115 
116 
117   if ( ( (med_mesh_type) _intmeshtype ) == MED_UNSTRUCTURED_MESH ) {
118 
119 
120     if ( _MEDmeshAdvancedWr(fid,
121 			    meshname,
122 			    MED_COORDINATE,
123 			    MED_NO_NAME,
124 			    MED_INTERNAL_UNDEF,
125 			    numdt,
126 			    numit,
127 			    dt,
128 			    MED_NODE,
129 			    MED_NONE,
130 			    MED_NO_CMODE,
131 			    MED_UNDEF_STMODE,
132 			    MED_NO_PROFILE,
133 			    MED_UNDEF_INTERLACE,
134 			    MED_ALL_CONSTITUENT,
135 			    filter,
136 			    MED_UNDEF_SIZE,
137 			    coordinate) <0 ) {
138       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDmeshAdvancedWr");
139       goto ERROR;
140     }
141 
142   } else {
143     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_MESHTYPE,MED_ERR_MESH_MSG);
144     SSCRUTE(meshname);SSCRUTE(MED_NOM_GTY);goto ERROR;
145   }
146 
147   _ret = 0;
148  ERROR:
149 
150   if (_datagroup_trsf>0)     if (_MEDdatagroupFermer(_datagroup_trsf) < 0) {
151     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroup_trsfname);
152     ISCRUTE_id(_datagroup_trsf);
153   }
154 
155   if (_datagroup1>0)     if (_MEDdatagroupFermer(_datagroup1) < 0) {
156     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
157     ISCRUTE_id(_datagroup1);ISCRUTE(numdt);ISCRUTE(numit);
158   }
159 
160   if (_meshid>0)            if (_MEDdatagroupFermer(_meshid) < 0) {
161     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,meshname);
162     ISCRUTE_id(_meshid);
163   }
164 
165  return _ret;
166 
167 }
168