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 \MEDmeshNodeCoordinateTrsfWrBrief
27    \param fid \fid
28    \param meshname \meshname
29    \param numdt \numdt
30    \param numit \numit
31    \param dt \dt
32    \param coordinatetrsf \coordinatetrsf
33    \retval med_err \error
34    \details \MEDmeshNodeCoordinateTrsfWrDetails
35    \remarks
36    \li \MEDmeshNodeCoordinateTrsfRm1
37    \li \MEDmeshNodeCoordinateTrsfRm2
38    \li \MEDmeshNodeCoordinateTrsfRm3
39 */
40 
MEDmeshNodeCoordinateTrsfWr(const med_idt fid,const char * const meshname,const med_int numdt,const med_int numit,const med_float dt,const med_float * const coordinatetrsf)41 med_err MEDmeshNodeCoordinateTrsfWr(const med_idt               fid,
42 				    const char*  const          meshname,
43 				    const med_int               numdt,
44 				    const med_int               numit,
45 				    const med_float             dt,
46 				    const med_float* const      coordinatetrsf)
47 {
48   med_err         _ret         = -1;
49   med_idt         _meshid      = 0,_datagroup1=0,_dataset_coo=0;
50   med_int         _intmeshtype = 0;
51   char            _meshpath   [MED_MESH_SUPPORT_GRP_SIZE+MED_NAME_SIZE+1]="";
52   char            _dataset_cooname[MED_TAILLE_NOM_ENTITE+1+3+1]=MED_NOM_NOE"/"MED_NOM_COO;
53   med_bool        _isasupportmesh=MED_FALSE,_isasoftlink=MED_FALSE;
54 
55 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
56 
57   /* Il ne peut pas y  avoir de transformation géométrique à MED_NO_DT, MED_NO_IT */
58   if ( (numdt == MED_NO_DT) && (numit == MED_NO_IT) ) {
59     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_PARAMETER,MED_ERR_MESH_MSG);
60     SSCRUTE(_meshpath); ISCRUTE(numdt);ISCRUTE(numit);goto ERROR;
61   }
62 
63   /* Maillage de calcul ou maillage support */
64   if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
65     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
66     SSCRUTE(_meshpath); goto ERROR;
67   }
68 
69   /* Lecture de l'attribut du type de maillage MED_NOM_TYP  */
70   if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
71     MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
72     SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
73   }
74 
75   /* Accès (création éventuelle non attendue) du datagroup numdt,numit */
76   if ( _isasupportmesh ) {
77       MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_PARAMETER,"");
78       SSCRUTE(meshname);goto ERROR;
79   } else
80     if ( (_datagroup1 =_MEDmeshAssociatedGroupCr(fid, MED_MESH_GRP,
81 						 meshname, numdt, numit, dt, MED_FALSE,
82 						 "." ) ) < 0 ) {
83       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDmeshAssociatedGroupCr");
84       goto ERROR;
85     }
86 
87   /* Erreur si un un dataset  MED_NODE/MED_COORDINATE existe */
88   if ( _MEDisasoftlink(_datagroup1, _dataset_cooname,MED_TRUE, &_isasoftlink ) < 0) {
89     MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_LINK,MED_NOM_COO);
90     goto ERROR;
91   }
92 /*  ISCRUTE_int(_isasoftlink);*/
93   if (!_isasoftlink) {
94     MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_DATASET,MED_NOM_COO);
95     goto ERROR;
96   }
97 
98   if ( ( (med_mesh_type) _intmeshtype ) == MED_UNSTRUCTURED_MESH ) {
99 
100     if (  _MEDmeshAdvancedWr(fid,
101 			     meshname,
102 			     MED_COORDINATE_TRSF,
103 			     MED_NO_NAME,
104 			     MED_INTERNAL_UNDEF,
105 			     numdt,
106 			     numit,
107 			     dt,
108 			     MED_NODE,
109 			     MED_NONE,
110 			     MED_NO_CMODE,
111 			     MED_UNDEF_STMODE,
112 			     MED_NO_PROFILE,
113 			     MED_NO_INTERLACE,
114 			     MED_ALL_CONSTITUENT,
115 			     NULL,
116 			     7,
117 			     coordinatetrsf) < 0 ) {
118       MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDmeshAdvancedWr");
119       goto ERROR;
120 
121     }
122 
123   } else {
124     MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_MESHTYPE,MED_ERR_MESH_MSG);
125     SSCRUTE(meshname);SSCRUTE(MED_NOM_GTY);goto ERROR;
126   }
127 
128   _ret = 0;
129 
130  ERROR:
131   if (_dataset_coo>0)     if (_MEDdatagroupFermer(_dataset_coo) < 0) {
132     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_dataset_cooname);
133     ISCRUTE_id(_dataset_coo);
134   }
135 
136   if (_datagroup1>0)     if (_MEDdatagroupFermer(_datagroup1) < 0) {
137     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
138     ISCRUTE_id(_datagroup1);ISCRUTE(numdt);ISCRUTE(numit);
139   }
140 
141   if (_meshid>0)            if (_MEDdatagroupFermer(_meshid) < 0) {
142     MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,meshname);
143     ISCRUTE_id(_meshid);
144   }
145 
146   return _ret;
147 }
148