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 
_MEDgetGeometricParameter(const med_entity_type entitytype,const med_geometry_type geotype,med_int * const entdim,med_int * const nnodes,med_int * const nndes)23 med_err _MEDgetGeometricParameter(const med_entity_type       entitytype,
24 				  const med_geometry_type     geotype,
25 				  med_int * const             entdim,
26 				  med_int * const             nnodes,
27 				  med_int * const             nndes)
28 {
29 
30   med_err _ret=-1;
31 
32   /* TODO : MED_NODE_ELEMENT */
33   if ( entitytype == MED_NODE     ) {*nnodes=0;*nndes=0;*entdim=1; return 0;}
34   /*Le nombre de noeuds des polygones des utilisateurs est dynamiquement fixé.
35    Il n'y a donc pas de gestion d'entrelacement.
36    Le tableau d'index permettrait tout de même de developper une selection par filtre
37    en deux passes :
38    1) Filtre sur les indices 2) Création du tableau de filtre à partir de la selection des indices
39   */
40   if ( geotype    == MED_POLYGON  )   {*nnodes=1;*nndes=1;*entdim=-1;return 0;}
41   if ( geotype    == MED_POLYGON2 )   {*nnodes=1;*nndes=1;*entdim=-1;return 0;}
42   if ( geotype    == MED_POLYHEDRON ) {*nnodes=1;*nndes=1;*entdim=-1;return 0;}
43 
44   *nnodes = geotype % 100;
45   *entdim = geotype / 100;
46 
47   switch(entitytype)
48     {
49     case MED_CELL :
50       switch (geotype)
51 	{
52 	case MED_POINT1 :
53 	  *nndes = 0;
54 	  break;
55 
56 	case MED_SEG2 :
57 	  *nndes = 2;
58 	  break;
59 
60 	case MED_SEG3 :
61 	  *nndes = 3;
62 	  break;
63 
64 	case MED_SEG4 :
65 	  *nndes = 4;
66 	  break;
67 
68 	case MED_TRIA3 :
69 	  *nndes = 3;
70 	  break;
71 
72 	case MED_TRIA6 :
73 	  *nndes = 3;
74 	  break;
75 
76 	case MED_TRIA7 :
77 	  *nndes = 3;
78 	  break;
79 
80 	case MED_QUAD4 :
81 	  *nndes = 4;
82 	  break;
83 
84 	case MED_QUAD8 :
85 	  *nndes = 4;
86 	  break;
87 
88 	case MED_QUAD9 :
89 	  *nndes = 4;
90 	  break;
91 
92 	case MED_TETRA4 :
93 	  *nndes = 4;
94 	  break;
95 
96 	case MED_TETRA10 :
97 	  *nndes = 4;
98 	  break;
99 
100 	case MED_OCTA12 :
101 	  *nndes = 8;
102 	  break;
103 
104 	case MED_HEXA8 :
105 	  *nndes = 6;
106 	  break;
107 
108 	case MED_HEXA20 :
109 	  *nndes = 6;
110 	  break;
111 
112 	case MED_HEXA27 :
113 	  *nndes = 6;
114 	  break;
115 
116 	case MED_PENTA6 :
117 	  *nndes = 5;
118 	  break;
119 
120 	case MED_PENTA15 :
121 	  *nndes = 5;
122 	  break;
123 
124 	case MED_PENTA18 :
125 	  *nndes = 5;
126 	  break;
127 
128 	case MED_PYRA5 :
129 	  *nndes = 5;
130 	  break;
131 
132 	case MED_PYRA13 :
133 	  *nndes = 5;
134 	  break;
135 
136 	default :
137 	  return -1;
138 	}
139       break;
140 
141     case MED_DESCENDING_FACE :
142       switch(geotype)
143 	{
144 	case MED_TRIA3 :
145 	  *nndes = 3;
146 	  break;
147 
148 	case MED_TRIA6 :
149 	  *nndes = 3;
150 	  break;
151 
152 	case MED_QUAD4 :
153 	  *nndes = 4;
154 	  break;
155 
156 	case MED_QUAD8 :
157 	  *nndes = 4;
158 	  break;
159 
160 	default :
161 	  return -1;
162 	}
163       break;
164 
165     case MED_DESCENDING_EDGE :
166       switch(geotype)
167 	{
168 	case MED_SEG2 :
169 	  *nndes = 2;
170 	  break;
171 
172 	case MED_SEG3 :
173 	  *nndes = 3;
174 	  break;
175 
176 	default :
177 	  return -1;
178 	}
179       break;
180 
181     default :
182       MED_ERR_(_ret,MED_ERR_RANGE,MED_ERR_ENTITY,MED_ERR_VALUE_MSG);
183       ISCRUTE_int(entitytype); goto ERROR;
184     }
185 
186   _ret = 0;
187  ERROR:
188   return _ret;
189 }
190