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