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