Salome HOME
Homard executable
[modules/homard.git] / src / tool / Gestion_MTU / gmmoge.F
1       subroutine gmmoge ( modgm, typarr,
2      >                    nenti, nreel, nch08,
3      >                    nfconf, lfconf,
4      >                    codret )
5 c ______________________________________________________________________
6 c
7 c                             H O M A R D
8 c
9 c Outil de Maillage Adaptatif par Raffinement et Deraffinement d'EDF R&D
10 c
11 c Version originale enregistree le 18 juin 1996 sous le numero 96036
12 c aupres des huissiers de justice Simart et Lavoir a Clamart
13 c Version 11.2 enregistree le 13 fevrier 2015 sous le numero 2015/014
14 c aupres des huissiers de justice
15 c Lavoir, Silinski & Cherqui-Abrahmi a Clamart
16 c
17 c    HOMARD est une marque deposee d'Electricite de France
18 c
19 c Copyright EDF 1996
20 c Copyright EDF 1998
21 c Copyright EDF 2002
22 c Copyright EDF 2020
23 c ______________________________________________________________________
24 c
25 c     Gestion de la Memoire : MOde de GEstion
26 c     -             -         --      --
27 c ______________________________________________________________________
28 c .        .     .        .                                            .
29 c .  nom   . e/s . taille .           description                      .
30 c .____________________________________________________________________.
31 c . modgm  .  s  .    1   . 0 : mode statique                          .
32 c .        .     .        . 1 : mode semi-dynamique                    .
33 c .        .     .        . 2 : mode dynamique                         .
34 c . typarr .  s  .    1   . gere les arrets de gm en cas de probleme   .
35 c .        .     .        . 0 : arret par le programme ad-hoc          .
36 c .        .     .        . 1 : code de retour non nul                 .
37 c . nenti  .  s  .    1   . nombre d'entiers                           .
38 c . nreel  .  s  .    1   . nombre de reels                            .
39 c . nresp  .  s  .    1   . nombre de reels simple precision           .
40 c . nfconf . e   . ch<200 . nom du fichier de configuration            .
41 c . lfconf . e   .    1   . longueur du nom du fichier                 .
42 c . codret .  s  .    1   . 0 : tout va bien                           .
43 c .        .     .        . 1 : probleme                               .
44 c ______________________________________________________________________
45 c
46 c====
47 c 0. declarations et dimensionnement
48 c====
49 c
50 c 0.1. ==> generalites
51 c
52       implicit none
53       save
54 c
55       character*6 nompro
56       parameter ( nompro = 'GMMOGE' )
57 c
58 #include "genbla.h"
59 c
60 c 0.2. ==> communs
61 c
62 #include "gmimpr.h"
63 #include "gmlang.h"
64 c
65 c les communs qui suivent sont ici pour declarer les variables lgxxxx
66 c
67 #include "gmenti.h"
68 #include "gmreel.h"
69 #include "gmstri.h"
70 c
71 c 0.3. ==> arguments
72 c
73       character*(*) nfconf
74 c
75       integer lfconf
76       integer modgm
77       integer typarr
78       integer nenti, nreel, nch08
79       integer codret
80 c
81 c 0.4. ==> variables locales
82 c
83       integer iaux, nbaux, codre0
84       integer lfmode
85 c
86       integer nbtype
87       parameter ( nbtype = 3 )
88 c
89       character*8 motcle
90       character*200 nfmode
91 c
92       character*5 fmtent
93 c
94 #include "motcle.h"
95 c
96       integer nbmess
97       parameter ( nbmess = 10 )
98       character*80 texte(nblang,nbmess)
99 c
100 c 0.5. ==> initialisations
101 c
102 c ______________________________________________________________________
103 c
104 c====
105 c 1. messages
106 c====
107 c
108 #include "impr01.h"
109 c
110 #ifdef _DEBUG_HOMARD_
111       write (ulsort,texte(langue,1)) 'Entree', nompro
112       call dmflsh (iaux)
113 #endif
114 c
115       texte(1,10) =
116      >'(''L''''option de la memoire '',a8,'' est absente.'')'
117       texte(1,4) = '(''On impose un mode de gestion dynamique.'')'
118       texte(1,5) =
119      >'(''L''''option de la memoire '',a8,'' est illisible.'')'
120       texte(1,6) = '(''On impose 0 valeurs.'')'
121       texte(1,7) = '(''Le type '',i8,'' ne convient pas.'')'
122       texte(1,8) = '(''Il faut 0 ou 1.'')'
123 c
124       texte(2,10) = '(''The option '',a8,'' is missing.'')'
125       texte(2,4) = '(''A dynamic memory management is imposed.'')'
126       texte(2,5) = '(''The option '',a8,'' cannot be read.'')'
127       texte(2,6) = '(''0 values are imposed.'')'
128       texte(2,7) = '(''Type '',i8,'' is not correct.'')'
129       texte(2,8) = '(''0 or 1 is needed.'')'
130 c
131 c====
132 c 2. recuperation du mode de gestion de la memoire
133 c====
134 c
135 c 2.1. ==> recherche de l'option de pilotage qui contient le
136 c          le mode de gestion de la memoire
137 c
138       motcle = mcmogm
139       call ugfino ( motcle, nfmode, lfmode,
140      >              nfconf, lfconf,
141      >              ulsort , langue, codret )
142 c
143 c 2.2. ==> si aucune option n'a ete precisee, on passe en mode dynamique
144 c
145       if ( codret.eq.1 ) then
146 #ifdef _DEBUG_HOMARD_
147         write (ulsort,texte(langue,1)) 'Sortie', nompro
148         write (ulsort,texte(langue,10)) motcle
149         write (ulsort,texte(langue,4))
150 #endif
151 c
152         modgm = 2
153         codret = 0
154 c
155 c 2.3. ==> probleme de lecture
156 c
157       elseif ( codret.ne.0 ) then
158 c
159         write (ulsort,texte(langue,1)) 'Sortie', nompro
160         write (ulsort,texte(langue,5)) motcle
161 c
162         codret = 1
163 c
164 c 2.3. ==> si l'option est dynamique, on y va !
165 c
166       elseif ( nfmode(1:lfmode).eq.'Dynamique' .or.
167      >         nfmode(1:lfmode).eq.'DYNAMIQUE' .or.
168      >         nfmode(1:lfmode).eq.'dynamique' ) then
169 c
170         modgm = 2
171 c
172 c 2.4. ==> si l'option est semi-dynamique, on y va !
173 c
174       elseif ( nfmode(1:lfmode).eq.'Semi-Dynamique' .or.
175      >         nfmode(1:lfmode).eq.'SEMI-DYNAMIQUE' .or.
176      >         nfmode(1:lfmode).eq.'semi-dynamique' ) then
177 c
178         modgm = 1
179 c
180 c 2.5. ==> si l'option est statique, on y va !
181 c
182       elseif ( nfmode(1:lfmode).eq.'Statique' .or.
183      >         nfmode(1:lfmode).eq.'STATIQUE' .or.
184      >         nfmode(1:lfmode).eq.'statique' ) then
185 c
186         modgm = 0
187 c
188 c 2.6. ==> sinon, il y a un probleme
189 c
190       else
191 c
192         write (ulsort,texte(langue,1)) 'Sortie', nompro
193         write (ulsort,texte(langue,5)) motcle
194         if ( lfmode.gt.0 ) then
195           write (ulsort,*) nfmode(1:lfmode)
196         else
197           write (ulsort,*)
198         endif
199 c
200         codret = 1
201 c
202       endif
203 c
204 c====
205 c 3. determination des tailles
206 c====
207 c
208       if ( codret.eq.0 ) then
209 c
210 c 3.1. ==> en mode statique, on met les tailles des parameter
211 c
212       if ( modgm.eq.0 ) then
213 c
214         nenti = lgcomi
215         nreel = lgcomr
216         nch08 = lgcoms
217 c
218 c 3.2. ==> en mode semi-dynamique, on lit les tailles
219 c
220       elseif ( modgm.eq.1 ) then
221 c
222         do 32 , iaux = 1 , nbtype
223 c
224 c 3.2.1. ==> recherche du motcle dans le fichier de configuration
225 c
226           if ( iaux.eq.1 ) then
227             motcle = mcgmen
228           elseif ( iaux.eq.2 ) then
229             motcle = mcgmre
230           elseif ( iaux.eq.3 ) then
231             motcle = mcgmc8
232           endif
233 c
234           call ugfino ( motcle, nfmode, lfmode,
235      >                  nfconf, lfconf,
236      >                  ulsort , langue, codre0 )
237 c
238 c 3.2.2. ==> si aucune taille n'a ete precisee, on met 0
239 c
240           if ( codre0.eq.1 ) then
241 #ifdef _DEBUG_HOMARD_
242             write (ulsort,texte(langue,1)) 'Sortie', nompro
243             write (ulsort,texte(langue,10)) motcle
244             write (ulsort,texte(langue,6))
245 #endif
246 c
247             nbaux = 0
248             codre0 = 0
249 c
250 c 3.2.3. ==> probleme de lecture
251 c
252           elseif ( codre0.ne.0 ) then
253 c
254             write (ulsort,texte(langue,1)) 'Sortie', nompro
255             write (ulsort,texte(langue,5)) motcle
256 c
257             nbaux = 0
258 c
259 c 3.2.4. ==> decodage
260 c
261           else
262 c
263             if ( lfmode.gt.0 .and. lfmode.lt.100 ) then
264 c
265               fmtent = '(I  )'
266               if ( lfmode.lt.10 ) then
267                 write(fmtent(3:3),'(i1)') lfmode
268               else
269                 write(fmtent(3:4),'(i2)') lfmode
270               endif
271               read ( nfmode,fmtent) nbaux
272 c
273             else
274               write (ulsort,texte(langue,1)) 'Sortie', nompro
275               write (ulsort,texte(langue,5)) motcle
276               codre0 = 3
277               nbaux = 0
278             endif
279 c
280           endif
281 c
282 c 3.2.5. ==> bilan
283 c
284           if ( iaux.eq.1 ) then
285             nenti = max(0, nbaux )
286           elseif ( iaux.eq.2 ) then
287             nreel = max(0, nbaux )
288           elseif ( iaux.eq.3 ) then
289             nch08 = max(0, nbaux )
290           endif
291 c
292           codret = max ( codret, abs(codre0) )
293 c
294    32   continue
295 c
296 c 3.3. ==> en mode dynamique, on met des tailles nulles
297 c
298       else
299 c
300         nenti = 0
301         nreel = 0
302         nch08 = 0
303 c
304       endif
305 c
306       endif
307 c
308 c====
309 c 4. type d'arret
310 c====
311 c
312       if ( codret.eq.0 ) then
313 c
314 c 4.1. ==> recherche de l'option de pilotage qui contient le
315 c          le type d'arret de la gestion de la memoire
316 c
317         motcle = mcgmta
318         call ugfino ( motcle, nfmode, lfmode,
319      >                nfconf, lfconf,
320      >                ulsort , langue, codre0 )
321 c
322 c 4.2. ==> si aucune option n'a ete precisee, on arretera brutalement
323 c
324         if ( codre0.eq.1 ) then
325 c
326           typarr = 0
327 c
328 c 4.3. ==> probleme de lecture
329 c
330         elseif ( codre0.ne.0 ) then
331 c
332           write (ulsort,texte(langue,1)) 'Sortie', nompro
333           write (ulsort,texte(langue,10)) motcle
334           write (ulsort,texte(langue,5))
335 c
336           typarr = 0
337           codret = 1
338 c
339 c 4.4. ==> decodage
340 c
341         else
342 c
343           if ( lfmode.gt.0 .and. lfmode.lt.100 ) then
344 c
345             fmtent = '(I  )'
346             if ( lfmode.lt.10 ) then
347               write(fmtent(3:3),'(i1)') lfmode
348             else
349               write(fmtent(3:4),'(i2)') lfmode
350             endif
351             read ( nfmode,fmtent) typarr
352 c
353           else
354             write (ulsort,texte(langue,1)) 'Sortie', nompro
355             write (ulsort,texte(langue,10)) motcle
356             if ( lfmode.gt.0 ) then
357               write (ulsort,*) nfmode(1:lfmode)
358             else
359               write (ulsort,*)
360             endif
361             write (ulsort,texte(langue,8))
362             typarr = 0
363             codret = 1
364           endif
365 c
366         endif
367 c
368 c 4.5. ==> verification
369 c
370         if ( typarr.lt.0 .or. typarr.gt.1 ) then
371           write (ulsort,texte(langue,1)) 'Sortie', nompro
372           write (ulsort,texte(langue,10)) motcle
373           write (ulsort,texte(langue,7)) typarr
374           write (ulsort,texte(langue,8))
375           typarr = 0
376           codret = 1
377         endif
378 c
379       endif
380 c
381 c====
382 c 5. en mode semi-dynamique : le mode de gestion passe en dynamique
383 c    si toutes les valeurs sont nulles
384 c====
385 c
386       if ( codret.eq.0 ) then
387 c
388         if ( modgm.eq.1 ) then
389 c
390           if ( (nenti.eq.0) .and.
391      >         (nreel.eq.0) .and.
392      >         (nch08.eq.0) ) then
393 c
394             modgm = 2
395 c
396           endif
397 c
398         endif
399 c
400       endif
401 c
402       end