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 \MEDmeshNodeCoordinateWithProfileWrBrief
27 \param fid \fid
28 \param meshname \meshname
29 \param numdt \numdt
30 \param numit \numit
31 \param dt \dt
32 \param storagemode \storagemode
33 \param profilename \profilename
34 \param switchmode \switchmode
35 \param dimselect \dimselect
36 \param nentity \nentity
37 \param coordinate \coordinate
38 \retval med_err \error
39 \details \MEDmeshNodeCoordinateWithProfileWrDetails
40 \remarks
41 \MEDmeshNodeCoordinateWrnogridRem
42 \see MEDmeshNodeCoordinateWr
43 \see MEDmeshNodeCoordinateAdvancedWr
44 */
45
MEDmeshNodeCoordinateWithProfileWr(const med_idt fid,const char * const meshname,const med_int numdt,const med_int numit,const med_float dt,const med_storage_mode storagemode,const char * const profilename,const med_switch_mode switchmode,const med_int dimselect,const med_int nentity,const med_float * const coordinate)46 med_err MEDmeshNodeCoordinateWithProfileWr(const med_idt fid,
47 const char* const meshname,
48 const med_int numdt,
49 const med_int numit,
50 const med_float dt,
51 const med_storage_mode storagemode,
52 const char * const profilename,
53 const med_switch_mode switchmode,
54 const med_int dimselect,
55 const med_int nentity,
56 const med_float* const coordinate)
57 {
58 med_err _ret = -1;
59 med_idt _meshid = 0,_datagroup1=0,_datagroup_trsf=0;
60 med_idt _dataset_trsf = 0;
61 med_int _intmeshtype = 0;
62 char _meshpath [MED_MESH_SUPPORT_GRP_SIZE+MED_NAME_SIZE+1]="";
63 char _datagroup_trsfname[MED_TAILLE_NOM_ENTITE+MED_TAILLE_COOTRF+1]=MED_NOM_NOE MED_COOTRF;
64 med_bool _isasupportmesh=MED_FALSE,_isasoftlink=MED_FALSE;
65
66 if (_MEDcheckVersion30(fid) < 0) goto ERROR;
67
68 /* Maillage de calcul ou maillage support */
69 if ((_meshid=_MEDmeshDatagroupOpen(fid,meshname,_meshpath,&_isasupportmesh)) < 0) {
70 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_DATAGROUP,MED_ERR_MESH_MSG);
71 SSCRUTE(_meshpath); goto ERROR;
72 }
73
74 /* Lecture de l'attribut du type de maillage MED_NOM_TYP */
75 if (_MEDattrEntierLire(_meshid,MED_NOM_TYP,&_intmeshtype) < 0) {
76 MED_ERR_(_ret,MED_ERR_READ,MED_ERR_ATTRIBUTE,MED_ERR_MESH_MSG);
77 SSCRUTE(meshname);SSCRUTE(MED_NOM_TYP);ISCRUTE(_intmeshtype);goto ERROR;
78 }
79
80 /* Accès (création éventuelle non attendue) du datagroup numdt,numit */
81 if ( _isasupportmesh ) {
82 if (( numdt != MED_NO_DT) && (numit != MED_NO_IT) ) {
83 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_PARAMETER,MED_ERR_MESH_MSG);
84 SSCRUTE(meshname);ISCRUTE(numdt);ISCRUTE(numit);goto ERROR;
85 }
86 } else
87 if ( (_datagroup1 =_MEDmeshAssociatedGroupCr(fid, MED_MESH_GRP,
88 meshname, numdt, numit, dt, MED_FALSE,
89 "." ) ) < 0 ) {
90 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDmeshAssociatedGroupCr");
91 goto ERROR;
92 }
93
94 /*Réinitialisation du lien MED_TRSF_NOM/MED_COORDINATE_TRSF s'il existe */
95 /*Si un dataset de transformation existe une erreur est générée par
96 _MEDsoftlinkDel */
97 if ( !_isasupportmesh)
98 if ((_datagroup_trsf = _MEDdatagroupOuvrir(_datagroup1,_datagroup_trsfname)) > 0) {
99
100 if ( _MEDisasoftlink(_datagroup_trsf, MED_NOM_TRF,MED_FALSE, &_isasoftlink ) < 0 ) {
101 MED_ERR_(_ret,MED_ERR_OPEN,MED_ERR_LINK,MED_NOM_COO);
102 goto ERROR;
103 }
104 if (_isasoftlink ) {
105 if ( _MEDsoftlinkDel(_datagroup_trsf,
106 MED_NOM_TRF,
107 MED_TRUE) < 0 ) {
108 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDsoftlinkDel");
109 goto ERROR;
110 }
111 } else {
112 if ( (_dataset_trsf = _MEDdatasetOuvrir(_datagroup_trsf,MED_NOM_TRF)) >= 0 ) {
113 _MEDdatasetFermer(_dataset_trsf);
114 MED_ERR_(_ret,MED_ERR_NULL,MED_ERR_DATASET,MED_NOM_TRF);
115 goto ERROR;
116 }
117
118 }
119 }
120
121 if ( ( (med_mesh_type) _intmeshtype ) == MED_UNSTRUCTURED_MESH ) {
122
123 if ( _MEDmeshAdvancedWr(fid,
124 meshname,
125 MED_COORDINATE,
126 MED_NO_NAME,
127 MED_INTERNAL_UNDEF,
128 numdt,
129 numit,
130 dt,
131 MED_NODE,
132 MED_NONE,
133 MED_NO_CMODE,
134 storagemode,
135 profilename,
136 switchmode,
137 dimselect,
138 NULL,
139 nentity,
140 coordinate) < 0 ) {
141 MED_ERR_(_ret,MED_ERR_CALL,MED_ERR_API,"_MEDmeshAdvancedWr");
142 goto ERROR;
143 }
144
145 } else {
146 MED_ERR_(_ret,MED_ERR_INVALID,MED_ERR_MESHTYPE,MED_ERR_MESH_MSG);
147 SSCRUTE(meshname);SSCRUTE(MED_NOM_GTY);goto ERROR;
148 }
149
150
151 _ret = 0;
152 ERROR:
153
154 if (_datagroup_trsf>0) if (_MEDdatagroupFermer(_datagroup_trsf) < 0) {
155 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_datagroup_trsfname);
156 ISCRUTE_id(_datagroup_trsf);
157 }
158
159 if (_datagroup1>0) if (_MEDdatagroupFermer(_datagroup1) < 0) {
160 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,_meshpath);
161 ISCRUTE_id(_datagroup1);ISCRUTE(numdt);ISCRUTE(numit);
162 }
163
164 if (_meshid>0) if (_MEDdatagroupFermer(_meshid) < 0) {
165 MED_ERR_(_ret,MED_ERR_CLOSE,MED_ERR_DATAGROUP,meshname);
166 ISCRUTE_id(_meshid);
167 }
168
169 return _ret;
170 }
171