source: IOIPSL/trunk/src/getincom.f90 @ 963

Last change on this file since 963 was 963, checked in by bellier, 14 years ago

Added the "getin_name" subroutine which allows the user
to change the name of the definition file in which
the data will be read. ("run.def" by default)

  • Property svn:keywords set to Id
File size: 59.4 KB
RevLine 
[386]1MODULE getincom
2!-
[11]3!$Id$
[4]4!-
[386]5! This software is governed by the CeCILL license
6! See IOIPSL/IOIPSL_License_CeCILL.txt
[4]7!---------------------------------------------------------------------
[11]8USE errioipsl, ONLY : ipslerr
9USE stringop, &
[125]10 &   ONLY : nocomma,cmpblank,strlowercase
[4]11!-
[11]12IMPLICIT NONE
[4]13!-
[11]14PRIVATE
[963]15PUBLIC :: getin_name, getin, getin_dump
[4]16!-
[963]17!!--------------------------------------------------------------------
18!! The "getin_name" routine allows the user to change the name
19!! of the definition file in which the data will be read.
20!! ("run.def" by default)
21!!
22!!  SUBROUTINE getin_name (file_name)
23!!
24!! OPTIONAL INPUT argument
25!!
26!! (C) file_name :  the name of the file
27!!                  in which the data will be read
28!!--------------------------------------------------------------------
29!-
30!-
[11]31INTERFACE getin
[125]32!!--------------------------------------------------------------------
33!! The "getin" routines get a variable.
34!! We first check if we find it in the database
[963]35!! and if not we get it from the definition file.
[125]36!!
37!! SUBROUTINE getin (target,ret_val)
38!!
39!! INPUT
40!!
41!! (C) target : Name of the variable
42!!
43!! OUTPUT
44!!
45!! (I/R/C/L) ret_val : scalar, vector or matrix that will contain
46!!                     that will contain the (standard)
47!!                     integer/real/character/logical values
48!!--------------------------------------------------------------------
[11]49  MODULE PROCEDURE getinrs, getinr1d, getinr2d, &
50 &                 getinis, getini1d, getini2d, &
51 &                 getincs, getinc1d, getinc2d, &
52 &                 getinls, getinl1d, getinl2d
53END INTERFACE
[4]54!-
[125]55!!--------------------------------------------------------------------
56!! The "getin_dump" routine will dump the content of the database
[963]57!! into a file which has the same format as the definition file.
[125]58!! The idea is that the user can see which parameters were used
59!! and re-use the file for another run.
60!!
61!!  SUBROUTINE getin_dump (fileprefix)
62!!
63!! OPTIONAL INPUT argument
64!!
65!! (C) fileprefix : allows the user to change the name of the file
66!!                  in which the data will be archived
67!!--------------------------------------------------------------------
68!-
[4]69  INTEGER,PARAMETER :: max_files=100
70  CHARACTER(LEN=100),DIMENSION(max_files),SAVE :: filelist
71  INTEGER,SAVE      :: nbfiles
72!-
[963]73  INTEGER,SAVE :: allread=0
74  CHARACTER(LEN=100),SAVE :: def_file = 'run.def'
75!-
[536]76  INTEGER,PARAMETER :: i_txtslab=1000,l_n=30
77  INTEGER,SAVE :: nb_lines,i_txtsize=0
78  CHARACTER(LEN=100),SAVE,ALLOCATABLE,DIMENSION(:) :: fichier
79  CHARACTER(LEN=l_n),SAVE,ALLOCATABLE,DIMENSION(:) :: targetlist
80  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: fromfile,compline
[4]81!-
[11]82  INTEGER,PARAMETER :: n_d_fmt=5,max_msgs=15
83  CHARACTER(LEN=6),SAVE :: c_i_fmt = '(I5.5)'
84!-
[4]85! The data base of parameters
86!-
87  INTEGER,PARAMETER :: memslabs=200
[11]88  INTEGER,PARAMETER :: compress_lim=20
[4]89!-
90  INTEGER,SAVE :: nb_keys=0
91  INTEGER,SAVE :: keymemsize=0
92!-
[125]93! keystr definition
94! name of a key
95!-
[4]96! keystatus definition
[963]97! keystatus = 1 : Value comes from the file defined by 'def_file'
[4]98! keystatus = 2 : Default value is used
99! keystatus = 3 : Some vector elements were taken from default
100!-
101! keytype definition
[11]102! keytype = 1 : Integer
[4]103! keytype = 2 : Real
104! keytype = 3 : Character
105! keytype = 4 : Logical
106!-
[11]107  INTEGER,PARAMETER :: k_i=1, k_r=2, k_c=3, k_l=4
108!-
[4]109! Allow compression for keys (only for integer and real)
[125]110! keycompress < 0 : not compressed
[4]111! keycompress > 0 : number of repeat of the value
112!-
[125]113TYPE :: t_key
114  CHARACTER(LEN=l_n) :: keystr
115  INTEGER :: keystatus, keytype, keycompress, &
116 &           keyfromfile, keymemstart, keymemlen
117END TYPE t_key
[4]118!-
[125]119  TYPE(t_key),SAVE,ALLOCATABLE,DIMENSION(:) :: key_tab
[4]120!-
[536]121  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: i_mem
122  INTEGER,SAVE :: i_memsize=0, i_mempos=0
123  REAL,SAVE,ALLOCATABLE,DIMENSION(:) :: r_mem
124  INTEGER,SAVE :: r_memsize=0, r_mempos=0
125  CHARACTER(LEN=100),SAVE,ALLOCATABLE,DIMENSION(:) :: c_mem
126  INTEGER,SAVE :: c_memsize=0, c_mempos=0
127  LOGICAL,SAVE,ALLOCATABLE,DIMENSION(:) :: l_mem
128  INTEGER,SAVE :: l_memsize=0, l_mempos=0
[4]129!-
130CONTAINS
131!-
[963]132!=== DEFINITION FILE NAME INTERFACE
133!-
134SUBROUTINE getin_name (cname)
135!---------------------------------------------------------------------
136  IMPLICIT NONE
137!-
138  CHARACTER(LEN=*) :: cname
139!---------------------------------------------------------------------
140  IF (allread == 0) THEN
141    def_file = ADJUSTL(cname)
142  ELSE
143    CALL ipslerr (3,'getin_name', &
144 &   'The name of the database file (any_name.def)', &
145 &   'must be changed *before* any attempt','to read the database.')
146  ENDIF
147!------------------------
148END SUBROUTINE getin_name
149!-
[11]150!=== INTEGER INTERFACE
[4]151!-
[11]152SUBROUTINE getinis (target,ret_val)
[4]153!---------------------------------------------------------------------
154  IMPLICIT NONE
155!-
[11]156  CHARACTER(LEN=*) :: target
157  INTEGER :: ret_val
[4]158!-
[11]159  INTEGER,DIMENSION(1) :: tmp_ret_val
[125]160  INTEGER :: pos,status=0,fileorig
[4]161!---------------------------------------------------------------------
162!-
163! Do we have this target in our database ?
164!-
[125]165  CALL get_findkey (1,target,pos)
[4]166!-
167  tmp_ret_val(1) = ret_val
168!-
169  IF (pos < 0) THEN
170!-- Get the information out of the file
[11]171    CALL get_fil (target,status,fileorig,i_val=tmp_ret_val)
[4]172!-- Put the data into the database
[11]173    CALL get_wdb &
[125]174 &   (target,status,fileorig,1,i_val=tmp_ret_val)
[4]175  ELSE
176!-- Get the value out of the database
[11]177    CALL get_rdb (pos,1,target,i_val=tmp_ret_val)
[4]178  ENDIF
179  ret_val = tmp_ret_val(1)
180!---------------------
[11]181END SUBROUTINE getinis
[4]182!===
[11]183SUBROUTINE getini1d (target,ret_val)
[4]184!---------------------------------------------------------------------
185  IMPLICIT NONE
186!-
[11]187  CHARACTER(LEN=*) :: target
188  INTEGER,DIMENSION(:) :: ret_val
[4]189!-
[11]190  INTEGER,DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
[4]191  INTEGER,SAVE :: tmp_ret_size = 0
[125]192  INTEGER :: pos,size_of_in,status=0,fileorig
[4]193!---------------------------------------------------------------------
194!-
195! Do we have this target in our database ?
196!-
[125]197  CALL get_findkey (1,target,pos)
[4]198!-
199  size_of_in = SIZE(ret_val)
200  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
201    ALLOCATE (tmp_ret_val(size_of_in))
202  ELSE IF (size_of_in > tmp_ret_size) THEN
203    DEALLOCATE (tmp_ret_val)
204    ALLOCATE (tmp_ret_val(size_of_in))
205    tmp_ret_size = size_of_in
206  ENDIF
207  tmp_ret_val(1:size_of_in) = ret_val(1:size_of_in)
208!-
209  IF (pos < 0) THEN
[11]210!-- Get the information out of the file
211    CALL get_fil (target,status,fileorig,i_val=tmp_ret_val)
[4]212!-- Put the data into the database
[11]213    CALL get_wdb &
[125]214 &   (target,status,fileorig,size_of_in,i_val=tmp_ret_val)
[4]215  ELSE
216!-- Get the value out of the database
[11]217    CALL get_rdb (pos,size_of_in,target,i_val=tmp_ret_val)
[4]218  ENDIF
219  ret_val(1:size_of_in) = tmp_ret_val(1:size_of_in)
220!----------------------
[11]221END SUBROUTINE getini1d
[4]222!===
[11]223SUBROUTINE getini2d (target,ret_val)
[4]224!---------------------------------------------------------------------
225  IMPLICIT NONE
226!-
[11]227  CHARACTER(LEN=*) :: target
228  INTEGER,DIMENSION(:,:) :: ret_val
[4]229!-
[11]230  INTEGER,DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
[4]231  INTEGER,SAVE :: tmp_ret_size = 0
[125]232  INTEGER :: pos,size_of_in,size_1,size_2,status=0,fileorig
[11]233  INTEGER :: jl,jj,ji
[4]234!---------------------------------------------------------------------
235!-
236! Do we have this target in our database ?
237!-
[125]238  CALL get_findkey (1,target,pos)
[4]239!-
240  size_of_in = SIZE(ret_val)
241  size_1 = SIZE(ret_val,1)
242  size_2 = SIZE(ret_val,2)
243  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
244    ALLOCATE (tmp_ret_val(size_of_in))
245  ELSE IF (size_of_in > tmp_ret_size) THEN
246    DEALLOCATE (tmp_ret_val)
247    ALLOCATE (tmp_ret_val(size_of_in))
248    tmp_ret_size = size_of_in
249  ENDIF
250!-
251  jl=0
252  DO jj=1,size_2
253    DO ji=1,size_1
254      jl=jl+1
255      tmp_ret_val(jl) = ret_val(ji,jj)
256    ENDDO
257  ENDDO
258!-
259  IF (pos < 0) THEN
[11]260!-- Get the information out of the file
261    CALL get_fil (target,status,fileorig,i_val=tmp_ret_val)
[4]262!-- Put the data into the database
[11]263    CALL get_wdb &
[125]264 &   (target,status,fileorig,size_of_in,i_val=tmp_ret_val)
[4]265  ELSE
266!-- Get the value out of the database
[11]267    CALL get_rdb (pos,size_of_in,target,i_val=tmp_ret_val)
[4]268  ENDIF
269!-
270  jl=0
271  DO jj=1,size_2
272    DO ji=1,size_1
273      jl=jl+1
274      ret_val(ji,jj) = tmp_ret_val(jl)
275    ENDDO
276  ENDDO
277!----------------------
[11]278END SUBROUTINE getini2d
[4]279!-
[11]280!=== REAL INTERFACE
[4]281!-
[11]282SUBROUTINE getinrs (target,ret_val)
[4]283!---------------------------------------------------------------------
284  IMPLICIT NONE
285!-
[11]286  CHARACTER(LEN=*) :: target
287  REAL :: ret_val
[4]288!-
[11]289  REAL,DIMENSION(1) :: tmp_ret_val
[125]290  INTEGER :: pos,status=0,fileorig
[4]291!---------------------------------------------------------------------
292!-
293! Do we have this target in our database ?
294!-
[125]295  CALL get_findkey (1,target,pos)
[4]296!-
297  tmp_ret_val(1) = ret_val
298!-
299  IF (pos < 0) THEN
[11]300!-- Get the information out of the file
301    CALL get_fil (target,status,fileorig,r_val=tmp_ret_val)
[4]302!-- Put the data into the database
[11]303    CALL get_wdb &
[125]304 &   (target,status,fileorig,1,r_val=tmp_ret_val)
[11]305  ELSE
[4]306!-- Get the value out of the database
[11]307    CALL get_rdb (pos,1,target,r_val=tmp_ret_val)
[4]308  ENDIF
309  ret_val = tmp_ret_val(1)
310!---------------------
[11]311END SUBROUTINE getinrs
[4]312!===
[11]313SUBROUTINE getinr1d (target,ret_val)
[4]314!---------------------------------------------------------------------
315  IMPLICIT NONE
316!-
[11]317  CHARACTER(LEN=*) :: target
318  REAL,DIMENSION(:) :: ret_val
[4]319!-
[11]320  REAL,DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
[4]321  INTEGER,SAVE :: tmp_ret_size = 0
[125]322  INTEGER :: pos,size_of_in,status=0,fileorig
[4]323!---------------------------------------------------------------------
324!-
325! Do we have this target in our database ?
326!-
[125]327  CALL get_findkey (1,target,pos)
[4]328!-
329  size_of_in = SIZE(ret_val)
330  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
331    ALLOCATE (tmp_ret_val(size_of_in))
332  ELSE IF (size_of_in > tmp_ret_size) THEN
333    DEALLOCATE (tmp_ret_val)
334    ALLOCATE (tmp_ret_val(size_of_in))
335    tmp_ret_size = size_of_in
336  ENDIF
337  tmp_ret_val(1:size_of_in) = ret_val(1:size_of_in)
338!-
339  IF (pos < 0) THEN
[11]340!-- Get the information out of the file
341    CALL get_fil (target,status,fileorig,r_val=tmp_ret_val)
[4]342!-- Put the data into the database
[11]343    CALL get_wdb &
[125]344 &   (target,status,fileorig,size_of_in,r_val=tmp_ret_val)
[4]345  ELSE
346!-- Get the value out of the database
[11]347    CALL get_rdb (pos,size_of_in,target,r_val=tmp_ret_val)
[4]348  ENDIF
349  ret_val(1:size_of_in) = tmp_ret_val(1:size_of_in)
350!----------------------
[11]351END SUBROUTINE getinr1d
[4]352!===
[11]353SUBROUTINE getinr2d (target,ret_val)
[4]354!---------------------------------------------------------------------
355  IMPLICIT NONE
356!-
[11]357  CHARACTER(LEN=*) :: target
358  REAL,DIMENSION(:,:) :: ret_val
[4]359!-
[11]360  REAL,DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
[4]361  INTEGER,SAVE :: tmp_ret_size = 0
[125]362  INTEGER :: pos,size_of_in,size_1,size_2,status=0,fileorig
[11]363  INTEGER :: jl,jj,ji
[4]364!---------------------------------------------------------------------
365!-
366! Do we have this target in our database ?
367!-
[125]368  CALL get_findkey (1,target,pos)
[4]369!-
370  size_of_in = SIZE(ret_val)
371  size_1 = SIZE(ret_val,1)
372  size_2 = SIZE(ret_val,2)
373  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
374    ALLOCATE (tmp_ret_val(size_of_in))
375  ELSE IF (size_of_in > tmp_ret_size) THEN
376    DEALLOCATE (tmp_ret_val)
377    ALLOCATE (tmp_ret_val(size_of_in))
378    tmp_ret_size = size_of_in
379  ENDIF
380!-
381  jl=0
382  DO jj=1,size_2
383    DO ji=1,size_1
384      jl=jl+1
385      tmp_ret_val(jl) = ret_val(ji,jj)
386    ENDDO
387  ENDDO
388!-
389  IF (pos < 0) THEN
[11]390!-- Get the information out of the file
391    CALL get_fil (target,status,fileorig,r_val=tmp_ret_val)
[4]392!-- Put the data into the database
[11]393    CALL get_wdb &
[125]394 &   (target,status,fileorig,size_of_in,r_val=tmp_ret_val)
[4]395  ELSE
396!-- Get the value out of the database
[11]397    CALL get_rdb (pos,size_of_in,target,r_val=tmp_ret_val)
[4]398  ENDIF
399!-
400  jl=0
401  DO jj=1,size_2
402    DO ji=1,size_1
403      jl=jl+1
404      ret_val(ji,jj) = tmp_ret_val(jl)
405    ENDDO
406  ENDDO
407!----------------------
[11]408END SUBROUTINE getinr2d
[4]409!-
[11]410!=== CHARACTER INTERFACE
[4]411!-
[11]412SUBROUTINE getincs (target,ret_val)
[4]413!---------------------------------------------------------------------
414  IMPLICIT NONE
415!-
[11]416  CHARACTER(LEN=*) :: target
[4]417  CHARACTER(LEN=*) :: ret_val
418!-
419  CHARACTER(LEN=100),DIMENSION(1) :: tmp_ret_val
[125]420  INTEGER :: pos,status=0,fileorig
[4]421!---------------------------------------------------------------------
422!-
423! Do we have this target in our database ?
424!-
[125]425  CALL get_findkey (1,target,pos)
[4]426!-
427  tmp_ret_val(1) = ret_val
428!-
429  IF (pos < 0) THEN
[11]430!-- Get the information out of the file
431    CALL get_fil (target,status,fileorig,c_val=tmp_ret_val)
[4]432!-- Put the data into the database
[11]433    CALL get_wdb &
[125]434 &   (target,status,fileorig,1,c_val=tmp_ret_val)
[4]435  ELSE
436!-- Get the value out of the database
[11]437    CALL get_rdb (pos,1,target,c_val=tmp_ret_val)
[4]438  ENDIF
439  ret_val = tmp_ret_val(1)
440!---------------------
441END SUBROUTINE getincs
442!===
[11]443SUBROUTINE getinc1d (target,ret_val)
[4]444!---------------------------------------------------------------------
445  IMPLICIT NONE
446!-
[11]447  CHARACTER(LEN=*) :: target
[4]448  CHARACTER(LEN=*),DIMENSION(:) :: ret_val
449!-
450  CHARACTER(LEN=100),DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
451  INTEGER,SAVE :: tmp_ret_size = 0
[125]452  INTEGER :: pos,size_of_in,status=0,fileorig
[4]453!---------------------------------------------------------------------
454!-
455! Do we have this target in our database ?
456!-
[125]457  CALL get_findkey (1,target,pos)
[4]458!-
459  size_of_in = SIZE(ret_val)
460  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
461    ALLOCATE (tmp_ret_val(size_of_in))
462  ELSE IF (size_of_in > tmp_ret_size) THEN
463    DEALLOCATE (tmp_ret_val)
464    ALLOCATE (tmp_ret_val(size_of_in))
465    tmp_ret_size = size_of_in
466  ENDIF
467  tmp_ret_val(1:size_of_in) = ret_val(1:size_of_in)
468!-
469  IF (pos < 0) THEN
[11]470!-- Get the information out of the file
471    CALL get_fil (target,status,fileorig,c_val=tmp_ret_val)
[4]472!-- Put the data into the database
[11]473    CALL get_wdb &
[125]474 &   (target,status,fileorig,size_of_in,c_val=tmp_ret_val)
[4]475  ELSE
476!-- Get the value out of the database
[11]477    CALL get_rdb (pos,size_of_in,target,c_val=tmp_ret_val)
[4]478  ENDIF
479  ret_val(1:size_of_in) = tmp_ret_val(1:size_of_in)
480!----------------------
481END SUBROUTINE getinc1d
482!===
[11]483SUBROUTINE getinc2d (target,ret_val)
[4]484!---------------------------------------------------------------------
485  IMPLICIT NONE
486!-
[11]487  CHARACTER(LEN=*) :: target
[4]488  CHARACTER(LEN=*),DIMENSION(:,:) :: ret_val
489!-
490  CHARACTER(LEN=100),DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
491  INTEGER,SAVE :: tmp_ret_size = 0
[125]492  INTEGER :: pos,size_of_in,size_1,size_2,status=0,fileorig
[4]493  INTEGER :: jl,jj,ji
494!---------------------------------------------------------------------
495!-
496! Do we have this target in our database ?
497!-
[125]498  CALL get_findkey (1,target,pos)
[4]499!-
500  size_of_in = SIZE(ret_val)
501  size_1 = SIZE(ret_val,1)
502  size_2 = SIZE(ret_val,2)
503  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
504    ALLOCATE (tmp_ret_val(size_of_in))
505  ELSE IF (size_of_in > tmp_ret_size) THEN
506    DEALLOCATE (tmp_ret_val)
507    ALLOCATE (tmp_ret_val(size_of_in))
508    tmp_ret_size = size_of_in
509  ENDIF
510!-
511  jl=0
512  DO jj=1,size_2
513    DO ji=1,size_1
514      jl=jl+1
515      tmp_ret_val(jl) = ret_val(ji,jj)
516    ENDDO
517  ENDDO
518!-
519  IF (pos < 0) THEN
[11]520!-- Get the information out of the file
521    CALL get_fil (target,status,fileorig,c_val=tmp_ret_val)
[4]522!-- Put the data into the database
[11]523    CALL get_wdb &
[125]524 &   (target,status,fileorig,size_of_in,c_val=tmp_ret_val)
[4]525  ELSE
526!-- Get the value out of the database
[11]527    CALL get_rdb (pos,size_of_in,target,c_val=tmp_ret_val)
[4]528  ENDIF
529!-
530  jl=0
531  DO jj=1,size_2
532    DO ji=1,size_1
533      jl=jl+1
534      ret_val(ji,jj) = tmp_ret_val(jl)
535    ENDDO
536  ENDDO
537!----------------------
538END SUBROUTINE getinc2d
539!-
[11]540!=== LOGICAL INTERFACE
[4]541!-
[11]542SUBROUTINE getinls (target,ret_val)
[4]543!---------------------------------------------------------------------
544  IMPLICIT NONE
545!-
[11]546  CHARACTER(LEN=*) :: target
[4]547  LOGICAL :: ret_val
548!-
549  LOGICAL,DIMENSION(1) :: tmp_ret_val
[125]550  INTEGER :: pos,status=0,fileorig
[4]551!---------------------------------------------------------------------
552!-
553! Do we have this target in our database ?
554!-
[125]555  CALL get_findkey (1,target,pos)
[4]556!-
557  tmp_ret_val(1) = ret_val
558!-
559  IF (pos < 0) THEN
[11]560!-- Get the information out of the file
561    CALL get_fil (target,status,fileorig,l_val=tmp_ret_val)
[4]562!-- Put the data into the database
[11]563    CALL get_wdb &
[125]564 &   (target,status,fileorig,1,l_val=tmp_ret_val)
[4]565  ELSE
566!-- Get the value out of the database
[11]567    CALL get_rdb (pos,1,target,l_val=tmp_ret_val)
[4]568  ENDIF
569  ret_val = tmp_ret_val(1)
570!---------------------
571END SUBROUTINE getinls
572!===
[11]573SUBROUTINE getinl1d (target,ret_val)
[4]574!---------------------------------------------------------------------
575  IMPLICIT NONE
576!-
[11]577  CHARACTER(LEN=*) :: target
[4]578  LOGICAL,DIMENSION(:) :: ret_val
579!-
580  LOGICAL,DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
581  INTEGER,SAVE :: tmp_ret_size = 0
[125]582  INTEGER :: pos,size_of_in,status=0,fileorig
[4]583!---------------------------------------------------------------------
584!-
585! Do we have this target in our database ?
586!-
[125]587  CALL get_findkey (1,target,pos)
[4]588!-
589  size_of_in = SIZE(ret_val)
590  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
591    ALLOCATE (tmp_ret_val(size_of_in))
592  ELSE IF (size_of_in > tmp_ret_size) THEN
593    DEALLOCATE (tmp_ret_val)
594    ALLOCATE (tmp_ret_val(size_of_in))
595    tmp_ret_size = size_of_in
596  ENDIF
597  tmp_ret_val(1:size_of_in) = ret_val(1:size_of_in)
598!-
599  IF (pos < 0) THEN
[11]600!-- Get the information out of the file
601    CALL get_fil (target,status,fileorig,l_val=tmp_ret_val)
[4]602!-- Put the data into the database
[11]603    CALL get_wdb &
[125]604 &   (target,status,fileorig,size_of_in,l_val=tmp_ret_val)
[4]605  ELSE
606!-- Get the value out of the database
[11]607    CALL get_rdb (pos,size_of_in,target,l_val=tmp_ret_val)
[4]608  ENDIF
609  ret_val(1:size_of_in) = tmp_ret_val(1:size_of_in)
610!----------------------
611END SUBROUTINE getinl1d
612!===
[11]613SUBROUTINE getinl2d (target,ret_val)
[4]614!---------------------------------------------------------------------
615  IMPLICIT NONE
616!-
[11]617  CHARACTER(LEN=*) :: target
[4]618  LOGICAL,DIMENSION(:,:) :: ret_val
619!-
620  LOGICAL,DIMENSION(:),ALLOCATABLE,SAVE :: tmp_ret_val
621  INTEGER,SAVE :: tmp_ret_size = 0
[125]622  INTEGER :: pos,size_of_in,size_1,size_2,status=0,fileorig
[4]623  INTEGER :: jl,jj,ji
624!---------------------------------------------------------------------
625!-
626! Do we have this target in our database ?
627!-
[125]628  CALL get_findkey (1,target,pos)
[4]629!-
630  size_of_in = SIZE(ret_val)
631  size_1 = SIZE(ret_val,1)
632  size_2 = SIZE(ret_val,2)
633  IF (.NOT.ALLOCATED(tmp_ret_val)) THEN
634    ALLOCATE (tmp_ret_val(size_of_in))
635  ELSE IF (size_of_in > tmp_ret_size) THEN
636    DEALLOCATE (tmp_ret_val)
637    ALLOCATE (tmp_ret_val(size_of_in))
638    tmp_ret_size = size_of_in
639  ENDIF
640!-
641  jl=0
642  DO jj=1,size_2
643    DO ji=1,size_1
644      jl=jl+1
645      tmp_ret_val(jl) = ret_val(ji,jj)
646    ENDDO
647  ENDDO
648!-
649  IF (pos < 0) THEN
[11]650!-- Get the information out of the file
651    CALL get_fil (target,status,fileorig,l_val=tmp_ret_val)
[4]652!-- Put the data into the database
[11]653    CALL get_wdb &
[125]654 &   (target,status,fileorig,size_of_in,l_val=tmp_ret_val)
[4]655  ELSE
656!-- Get the value out of the database
[11]657    CALL get_rdb (pos,size_of_in,target,l_val=tmp_ret_val)
[4]658  ENDIF
659!-
660  jl=0
661  DO jj=1,size_2
662    DO ji=1,size_1
663      jl=jl+1
664      ret_val(ji,jj) = tmp_ret_val(jl)
665    ENDDO
666  ENDDO
667!----------------------
668END SUBROUTINE getinl2d
669!-
[11]670!=== Generic file/database INTERFACE
[4]671!-
[11]672SUBROUTINE get_fil (target,status,fileorig,i_val,r_val,c_val,l_val)
[4]673!---------------------------------------------------------------------
674!- Subroutine that will extract from the file the values
675!- attributed to the keyword target
676!-
[11]677!- (C) target    : target for which we will look in the file
678!- (I) status    : tells us from where we obtained the data
679!- (I) fileorig  : index of the file from which the key comes
680!- (I) i_val(:)  : INTEGER(nb_to_ret)   values
681!- (R) r_val(:)  : REAL(nb_to_ret)      values
682!- (L) l_val(:)  : LOGICAL(nb_to_ret)   values
683!- (C) c_val(:)  : CHARACTER(nb_to_ret) values
[4]684!---------------------------------------------------------------------
685  IMPLICIT NONE
686!-
[11]687  CHARACTER(LEN=*) :: target
688  INTEGER,INTENT(OUT) :: status,fileorig
689  INTEGER,DIMENSION(:),OPTIONAL          :: i_val
690  REAL,DIMENSION(:),OPTIONAL             :: r_val
691  LOGICAL,DIMENSION(:),OPTIONAL          :: l_val
692  CHARACTER(LEN=*),DIMENSION(:),OPTIONAL :: c_val
[4]693!-
[11]694  INTEGER :: k_typ,nb_to_ret,it,pos,len_str,status_cnt,io_err
695  CHARACTER(LEN=n_d_fmt)  :: cnt
696  CHARACTER(LEN=80) :: str_READ,str_READ_lower
697  CHARACTER(LEN=9)  :: c_vtyp
698  LOGICAL,DIMENSION(:),ALLOCATABLE :: found
699  LOGICAL :: def_beha,compressed
700  CHARACTER(LEN=10) :: c_fmt
701  INTEGER :: i_cmpval
702  REAL    :: r_cmpval
703  INTEGER :: ipos_tr,ipos_fl
704!---------------------------------------------------------------------
[4]705!-
[11]706! Get the type of the argument
707  CALL get_qtyp (k_typ,c_vtyp,i_val,r_val,c_val,l_val)
708  SELECT CASE (k_typ)
709  CASE(k_i)
710    nb_to_ret = SIZE(i_val)
711  CASE(k_r)
712    nb_to_ret = SIZE(r_val)
713  CASE(k_c)
714    nb_to_ret = SIZE(c_val)
715  CASE(k_l)
716    nb_to_ret = SIZE(l_val)
717  CASE DEFAULT
718    CALL ipslerr (3,'get_fil', &
719 &   'Internal error','Unknown type of data',' ')
720  END SELECT
721!-
722! Read the file(s)
[4]723  CALL getin_read
724!-
[11]725! Allocate and initialize the memory we need
726  ALLOCATE(found(nb_to_ret))
[4]727  found(:) = .FALSE.
728!-
729! See what we find in the files read
730  DO it=1,nb_to_ret
731!---
732!-- First try the target as it is
[125]733    CALL get_findkey (2,target,pos)
[4]734!---
735!-- Another try
736!---
737    IF (pos < 0) THEN
[11]738      WRITE(UNIT=cnt,FMT=c_i_fmt) it
[125]739      CALL get_findkey (2,TRIM(target)//'__'//cnt,pos)
[4]740    ENDIF
741!---
[11]742!-- We dont know from which file the target could come.
[4]743!-- Thus by default we attribute it to the first file :
744    fileorig = 1
745!---
746    IF (pos > 0) THEN
747!-----
748      found(it) = .TRUE.
749      fileorig = fromfile(pos)
750!-----
751!---- DECODE
752!-----
[11]753      str_READ = ADJUSTL(fichier(pos))
[4]754      str_READ_lower = str_READ
755      CALL strlowercase (str_READ_lower)
756!-----
[11]757      IF (    (TRIM(str_READ_lower) == 'def')     &
758 &        .OR.(TRIM(str_READ_lower) == 'default') ) THEN
[4]759        def_beha = .TRUE.
760      ELSE
761        def_beha = .FALSE.
762        len_str = LEN_TRIM(str_READ)
[11]763        io_err = 0
764        SELECT CASE (k_typ)
765        CASE(k_i)
766          WRITE (UNIT=c_fmt,FMT='("(I",I3.3,")")') len_str
767          READ (UNIT=str_READ(1:len_str), &
768 &              FMT=c_fmt,IOSTAT=io_err) i_val(it)
769        CASE(k_r)
770          READ (UNIT=str_READ(1:len_str), &
771 &              FMT=*,IOSTAT=io_err) r_val(it)
772        CASE(k_c)
773          c_val(it) = str_READ(1:len_str)
774        CASE(k_l)
775          ipos_tr = -1
776          ipos_fl = -1
777          ipos_tr = MAX(INDEX(str_READ_lower,'tru'), &
778 &                      INDEX(str_READ_lower,'y'))
779          ipos_fl = MAX(INDEX(str_READ_lower,'fal'), &
780 &                      INDEX(str_READ_lower,'n'))
781          IF (ipos_tr > 0) THEN
782            l_val(it) = .TRUE.
783          ELSE IF (ipos_fl > 0) THEN
784            l_val(it) = .FALSE.
785          ELSE
786            io_err = 100
787          ENDIF
788        END SELECT
789        IF (io_err /= 0) THEN
790          CALL ipslerr (3,'get_fil', &
791 &         'Target '//TRIM(target), &
792 &         'is not of '//TRIM(c_vtyp)//' type',' ')
[4]793        ENDIF
794      ENDIF
795!-----
[11]796      IF ( (k_typ == k_i).OR.(k_typ == k_r) ) THEN
797!-------
798!------ Is this the value of a compressed field ?
799        compressed = (compline(pos) > 0)
800        IF (compressed) THEN
801          IF (compline(pos) /= nb_to_ret) THEN
802            CALL ipslerr (2,'get_fil', &
803 &           'For key '//TRIM(target)//' we have a compressed field', &
804 &           'which does not have the right size.', &
805 &           'We will try to fix that.')
806          ENDIF
807          IF      (k_typ == k_i) THEN
808            i_cmpval = i_val(it)
809          ELSE IF (k_typ == k_r) THEN
810            r_cmpval = r_val(it)
811          ENDIF
812        ENDIF
813      ENDIF
[4]814    ELSE
815      found(it) = .FALSE.
[11]816      def_beha = .FALSE.
817      compressed = .FALSE.
[4]818    ENDIF
819  ENDDO
820!-
[11]821  IF ( (k_typ == k_i).OR.(k_typ == k_r) ) THEN
822!---
823!-- If this is a compressed field then we will uncompress it
824    IF (compressed) THEN
825      DO it=1,nb_to_ret
826        IF (.NOT.found(it)) THEN
827          IF      (k_typ == k_i) THEN
828            i_val(it) = i_cmpval
829          ELSE IF (k_typ == k_r) THEN
830          ENDIF
831          found(it) = .TRUE.
832        ENDIF
833      ENDDO
834    ENDIF
835  ENDIF
[4]836!-
[11]837! Now we set the status for what we found
[4]838  IF (def_beha) THEN
839    status = 2
[11]840    WRITE(*,*) 'USING DEFAULT BEHAVIOUR FOR ',TRIM(target)
[4]841  ELSE
842    status_cnt = 0
843    DO it=1,nb_to_ret
[11]844      IF (.NOT.found(it)) THEN
[4]845        status_cnt = status_cnt+1
[11]846        IF      (status_cnt <= max_msgs) THEN
847          WRITE (UNIT=*,FMT='(" USING DEFAULTS : ",A)', &
848 &               ADVANCE='NO') TRIM(target)
849          IF (nb_to_ret > 1) THEN
850            WRITE (UNIT=*,FMT='("__")',ADVANCE='NO')
851            WRITE (UNIT=*,FMT=c_i_fmt,ADVANCE='NO') it
852          ENDIF
853          SELECT CASE (k_typ)
854          CASE(k_i)
855            WRITE (UNIT=*,FMT=*) "=",i_val(it)
856          CASE(k_r)
857            WRITE (UNIT=*,FMT=*) "=",r_val(it)
858          CASE(k_c)
859            WRITE (UNIT=*,FMT=*) "=",c_val(it)
860          CASE(k_l)
861            WRITE (UNIT=*,FMT=*) "=",l_val(it)
862          END SELECT
863        ELSE IF (status_cnt == max_msgs+1) THEN
864          WRITE (UNIT=*,FMT='(" USING DEFAULTS ... ",A)')
[4]865        ENDIF
866      ENDIF
867    ENDDO
868!---
869    IF (status_cnt == 0) THEN
870      status = 1
871    ELSE IF (status_cnt == nb_to_ret) THEN
872      status = 2
873    ELSE
874      status = 3
875    ENDIF
876  ENDIF
[11]877! Deallocate the memory
878  DEALLOCATE(found)
[4]879!---------------------
[11]880END SUBROUTINE get_fil
881!===
882SUBROUTINE get_rdb (pos,size_of_in,target,i_val,r_val,c_val,l_val)
883!---------------------------------------------------------------------
884!- Read the required variable in the database
885!---------------------------------------------------------------------
886  IMPLICIT NONE
[4]887!-
[11]888  INTEGER :: pos,size_of_in
889  CHARACTER(LEN=*) :: target
890  INTEGER,DIMENSION(:),OPTIONAL          :: i_val
891  REAL,DIMENSION(:),OPTIONAL             :: r_val
892  LOGICAL,DIMENSION(:),OPTIONAL          :: l_val
893  CHARACTER(LEN=*),DIMENSION(:),OPTIONAL :: c_val
894!-
[125]895  INTEGER :: k_typ,k_beg,k_end
[11]896  CHARACTER(LEN=9) :: c_vtyp
897!---------------------------------------------------------------------
898!-
899! Get the type of the argument
900  CALL get_qtyp (k_typ,c_vtyp,i_val,r_val,c_val,l_val)
901  IF (     (k_typ /= k_i).AND.(k_typ /= k_r) &
902 &    .AND.(k_typ /= k_c).AND.(k_typ /= k_l) )THEN
903    CALL ipslerr (3,'get_rdb', &
904 &   'Internal error','Unknown type of data',' ')
905  ENDIF
906!-
[125]907  IF (key_tab(pos)%keytype /= k_typ) THEN
[11]908    CALL ipslerr (3,'get_rdb', &
909 &   'Wrong data type for keyword '//TRIM(target), &
910 &   '(NOT '//TRIM(c_vtyp)//')',' ')
911  ENDIF
912!-
[125]913  IF (key_tab(pos)%keycompress > 0) THEN
914    IF (    (key_tab(pos)%keycompress /= size_of_in) &
915 &      .OR.(key_tab(pos)%keymemlen /= 1) ) THEN
[11]916      CALL ipslerr (3,'get_rdb', &
917 &     'Wrong compression length','for keyword '//TRIM(target),' ')
918    ELSE
919      SELECT CASE (k_typ)
920      CASE(k_i)
[125]921        i_val(1:size_of_in) = i_mem(key_tab(pos)%keymemstart)
[11]922      CASE(k_r)
[125]923        r_val(1:size_of_in) = r_mem(key_tab(pos)%keymemstart)
[11]924      END SELECT
925    ENDIF
926  ELSE
[125]927    IF (key_tab(pos)%keymemlen /= size_of_in) THEN
[11]928      CALL ipslerr (3,'get_rdb', &
929 &     'Wrong array length','for keyword '//TRIM(target),' ')
930    ELSE
[125]931      k_beg = key_tab(pos)%keymemstart
932      k_end = k_beg+key_tab(pos)%keymemlen-1
[11]933      SELECT CASE (k_typ)
934      CASE(k_i)
[125]935        i_val(1:size_of_in) = i_mem(k_beg:k_end)
[11]936      CASE(k_r)
[125]937        r_val(1:size_of_in) = r_mem(k_beg:k_end)
[11]938      CASE(k_c)
[125]939        c_val(1:size_of_in) = c_mem(k_beg:k_end)
[11]940      CASE(k_l)
[125]941        l_val(1:size_of_in) = l_mem(k_beg:k_end)
[11]942      END SELECT
943    ENDIF
944  ENDIF
945!---------------------
946END SUBROUTINE get_rdb
[4]947!===
[11]948SUBROUTINE get_wdb &
[125]949 &  (target,status,fileorig,size_of_in, &
[11]950 &   i_val,r_val,c_val,l_val)
951!---------------------------------------------------------------------
952!- Write data into the data base
953!---------------------------------------------------------------------
954  IMPLICIT NONE
[4]955!-
[11]956  CHARACTER(LEN=*) :: target
[125]957  INTEGER :: status,fileorig,size_of_in
[11]958  INTEGER,DIMENSION(:),OPTIONAL          :: i_val
959  REAL,DIMENSION(:),OPTIONAL             :: r_val
960  LOGICAL,DIMENSION(:),OPTIONAL          :: l_val
961  CHARACTER(LEN=*),DIMENSION(:),OPTIONAL :: c_val
962!-
963  INTEGER :: k_typ
964  CHARACTER(LEN=9) :: c_vtyp
[125]965  INTEGER :: k_mempos,k_memsize,k_beg,k_end
[11]966  LOGICAL :: l_cmp
967!---------------------------------------------------------------------
968!-
969! Get the type of the argument
970  CALL get_qtyp (k_typ,c_vtyp,i_val,r_val,c_val,l_val)
971  IF (     (k_typ /= k_i).AND.(k_typ /= k_r) &
972 &    .AND.(k_typ /= k_c).AND.(k_typ /= k_l) )THEN
973    CALL ipslerr (3,'get_wdb', &
974 &   'Internal error','Unknown type of data',' ')
975  ENDIF
976!-
977! First check if we have sufficiant space for the new key
978  IF (nb_keys+1 > keymemsize) THEN
979    CALL getin_allockeys ()
980  ENDIF
981!-
982  SELECT CASE (k_typ)
983  CASE(k_i)
984    k_mempos = i_mempos; k_memsize = i_memsize;
985    l_cmp = (MINVAL(i_val) == MAXVAL(i_val)) &
986 &         .AND.(size_of_in > compress_lim)
987  CASE(k_r)
988    k_mempos = r_mempos; k_memsize = r_memsize;
989    l_cmp = (MINVAL(r_val) == MAXVAL(r_val)) &
990 &         .AND.(size_of_in > compress_lim)
991  CASE(k_c)
992    k_mempos = c_mempos; k_memsize = c_memsize;
993    l_cmp = .FALSE.
994  CASE(k_l)
995    k_mempos = l_mempos; k_memsize = l_memsize;
996    l_cmp = .FALSE.
997  END SELECT
998!-
999! Fill out the items of the data base
1000  nb_keys = nb_keys+1
[125]1001  key_tab(nb_keys)%keystr = target(1:MIN(LEN_TRIM(target),l_n))
1002  key_tab(nb_keys)%keystatus = status
1003  key_tab(nb_keys)%keytype = k_typ
1004  key_tab(nb_keys)%keyfromfile = fileorig
1005  key_tab(nb_keys)%keymemstart = k_mempos+1
[11]1006  IF (l_cmp) THEN
[125]1007    key_tab(nb_keys)%keycompress = size_of_in
1008    key_tab(nb_keys)%keymemlen = 1
[11]1009  ELSE
[125]1010    key_tab(nb_keys)%keycompress = -1
1011    key_tab(nb_keys)%keymemlen = size_of_in
[11]1012  ENDIF
1013!-
1014! Before writing the actual size lets see if we have the space
[125]1015  IF (key_tab(nb_keys)%keymemstart+key_tab(nb_keys)%keymemlen &
1016 &    > k_memsize) THEN
1017    CALL getin_allocmem (k_typ,key_tab(nb_keys)%keymemlen)
[11]1018  ENDIF
1019!-
[125]1020  k_beg = key_tab(nb_keys)%keymemstart
1021  k_end = k_beg+key_tab(nb_keys)%keymemlen-1
[11]1022  SELECT CASE (k_typ)
1023  CASE(k_i)
[125]1024    i_mem(k_beg:k_end) = i_val(1:key_tab(nb_keys)%keymemlen)
1025    i_mempos = k_end
[11]1026  CASE(k_r)
[125]1027    r_mem(k_beg:k_end) = r_val(1:key_tab(nb_keys)%keymemlen)
1028    r_mempos = k_end
[11]1029  CASE(k_c)
[125]1030    c_mem(k_beg:k_end) = c_val(1:key_tab(nb_keys)%keymemlen)
1031    c_mempos = k_end
[11]1032  CASE(k_l)
[125]1033    l_mem(k_beg:k_end) = l_val(1:key_tab(nb_keys)%keymemlen)
1034    l_mempos = k_end
[11]1035  END SELECT
1036!---------------------
1037END SUBROUTINE get_wdb
1038!-
1039!===
1040!-
[4]1041SUBROUTINE getin_read
1042!---------------------------------------------------------------------
1043  IMPLICIT NONE
1044!-
[11]1045  INTEGER,SAVE :: current
[4]1046!---------------------------------------------------------------------
1047  IF (allread == 0) THEN
1048!-- Allocate a first set of memory.
[536]1049    CALL getin_alloctxt ()
1050    CALL getin_allockeys ()
[11]1051    CALL getin_allocmem (k_i,0)
1052    CALL getin_allocmem (k_r,0)
1053    CALL getin_allocmem (k_c,0)
1054    CALL getin_allocmem (k_l,0)
[4]1055!-- Start with reading the files
1056    nbfiles = 1
[963]1057    filelist(1) = TRIM(def_file)
[4]1058    current = 1
1059!--
1060    DO WHILE (current <= nbfiles)
1061      CALL getin_readdef (current)
1062      current = current+1
1063    ENDDO
1064    allread = 1
1065    CALL getin_checkcohe ()
1066  ENDIF
1067!------------------------
1068END SUBROUTINE getin_read
1069!-
1070!===
1071!-
1072  SUBROUTINE getin_readdef(current)
1073!---------------------------------------------------------------------
1074!- This subroutine will read the files and only keep the
1075!- the relevant information. The information is kept as it
1076!- found in the file. The data will be analysed later.
1077!---------------------------------------------------------------------
1078  IMPLICIT NONE
1079!-
1080  INTEGER :: current
1081!-
[11]1082  CHARACTER(LEN=100) :: READ_str,NEW_str,last_key,key_str
1083  CHARACTER(LEN=n_d_fmt) :: cnt
1084  CHARACTER(LEN=10) :: c_fmt
[4]1085  INTEGER :: nb_lastkey
1086!-
[11]1087  INTEGER :: eof,ptn,len_str,i,it,iund,io_err
[4]1088  LOGICAL :: check = .FALSE.
1089!---------------------------------------------------------------------
1090  eof = 0
1091  ptn = 1
1092  nb_lastkey = 0
1093!-
1094  IF (check) THEN
1095    WRITE(*,*) 'getin_readdef : Open file ',TRIM(filelist(current))
1096  ENDIF
1097!-
[11]1098  OPEN (UNIT=22,FILE=filelist(current),STATUS="OLD",IOSTAT=io_err)
1099  IF (io_err /= 0) THEN
1100    CALL ipslerr (2,'getin_readdef', &
1101 &  'Could not open file '//TRIM(filelist(current)),' ',' ')
1102    RETURN
1103  ENDIF
[4]1104!-
1105  DO WHILE (eof /= 1)
1106!---
1107    CALL getin_skipafew (22,READ_str,eof,nb_lastkey)
1108    len_str = LEN_TRIM(READ_str)
1109    ptn = INDEX(READ_str,'=')
1110!---
1111    IF (ptn > 0) THEN
1112!---- Get the target
1113      key_str = TRIM(ADJUSTL(READ_str(1:ptn-1)))
[11]1114!---- Make sure that a vector keyword has the right length
1115      iund = INDEX(key_str,'__')
[4]1116      IF (iund > 0) THEN
[11]1117        WRITE (UNIT=c_fmt,FMT='("(I",I3.3,")")') &
1118 &        LEN_TRIM(key_str)-iund-1
1119        READ(UNIT=key_str(iund+2:LEN_TRIM(key_str)), &
1120 &           FMT=c_fmt,IOSTAT=io_err) it
1121        IF ( (io_err == 0).AND.(it > 0) ) THEN
1122          WRITE(UNIT=cnt,FMT=c_i_fmt) it
[4]1123          key_str = key_str(1:iund+1)//cnt
1124        ELSE
[11]1125          CALL ipslerr (3,'getin_readdef', &
1126 &         'A very strange key has just been found :', &
1127 &         TRIM(key_str),' ')
[4]1128        ENDIF
1129      ENDIF
1130!---- Prepare the content
1131      NEW_str = TRIM(ADJUSTL(READ_str(ptn+1:len_str)))
1132      CALL nocomma (NEW_str)
1133      CALL cmpblank (NEW_str)
1134      NEW_str  = TRIM(ADJUSTL(NEW_str))
1135      IF (check) THEN
1136        WRITE(*,*) &
1137 &        '--> getin_readdef : ',TRIM(key_str),' :: ',TRIM(NEW_str)
1138      ENDIF
1139!---- Decypher the content of NEW_str
1140!-
1141!---- This has to be a new key word, thus :
1142      nb_lastkey = 0
1143!----
1144      CALL getin_decrypt (current,key_str,NEW_str,last_key,nb_lastkey)
1145!----
1146    ELSE IF (len_str > 0) THEN
1147!---- Prepare the key if we have an old one to which
1148!---- we will add the line just read
1149      IF (nb_lastkey > 0) THEN
1150        iund =  INDEX(last_key,'__')
1151        IF (iund > 0) THEN
1152!-------- We only continue a keyword, thus it is easy
1153          key_str = last_key(1:iund-1)
1154        ELSE
1155          IF (nb_lastkey /= 1) THEN
[11]1156            CALL ipslerr (3,'getin_readdef', &
1157 &           'We can not have a scalar keyword', &
1158 &           'and a vector content',' ')
[4]1159          ENDIF
1160!-------- The last keyword needs to be transformed into a vector.
[11]1161          WRITE(UNIT=cnt,FMT=c_i_fmt) 1
[4]1162          targetlist(nb_lines) = &
[11]1163 &         last_key(1:MIN(LEN_TRIM(last_key),l_n-n_d_fmt-2))//'__'//cnt
1164          key_str = last_key(1:LEN_TRIM(last_key))
[4]1165        ENDIF
1166      ENDIF
1167!---- Prepare the content
1168      NEW_str = TRIM(ADJUSTL(READ_str(1:len_str)))
1169      CALL getin_decrypt (current,key_str,NEW_str,last_key,nb_lastkey)
1170    ELSE
[11]1171!---- If we have an empty line then the keyword finishes
[4]1172      nb_lastkey = 0
1173      IF (check) THEN
1174        WRITE(*,*) 'getin_readdef : Have found an emtpy line '
1175      ENDIF
1176    ENDIF
1177  ENDDO
1178!-
[11]1179  CLOSE(UNIT=22)
[4]1180!-
1181  IF (check) THEN
[963]1182    OPEN (UNIT=22,file=TRIM(def_file)//'.test')
[4]1183    DO i=1,nb_lines
[11]1184      WRITE(UNIT=22,FMT=*) targetlist(i)," : ",fichier(i)
[4]1185    ENDDO
[11]1186    CLOSE(UNIT=22)
[4]1187  ENDIF
1188!---------------------------
1189END SUBROUTINE getin_readdef
1190!-
1191!===
1192!-
1193SUBROUTINE getin_decrypt(current,key_str,NEW_str,last_key,nb_lastkey)
1194!---------------------------------------------------------------------
1195!- This subroutine is going to decypher the line.
1196!- It essentialy checks how many items are included and
1197!- it they can be attached to a key.
1198!---------------------------------------------------------------------
1199  IMPLICIT NONE
1200!-
1201! ARGUMENTS
1202!-
[11]1203  INTEGER :: current,nb_lastkey
1204  CHARACTER(LEN=*) :: key_str,NEW_str,last_key
[4]1205!-
1206! LOCAL
1207!-
[11]1208  INTEGER :: len_str,blk,nbve,starpos
1209  CHARACTER(LEN=100) :: tmp_str,new_key,mult
1210  CHARACTER(LEN=n_d_fmt) :: cnt
1211  CHARACTER(LEN=10) :: c_fmt
[4]1212!---------------------------------------------------------------------
1213  len_str = LEN_TRIM(NEW_str)
1214  blk = INDEX(NEW_str(1:len_str),' ')
1215  tmp_str = NEW_str(1:len_str)
1216!-
1217! If the key is a new file then we take it up. Else
1218! we save the line and go on.
1219!-
1220  IF (INDEX(key_str,'INCLUDEDEF') > 0) THEN
1221    DO WHILE (blk > 0)
1222      IF (nbfiles+1 > max_files) THEN
[11]1223        CALL ipslerr (3,'getin_decrypt', &
1224 &       'Too many files to include',' ',' ')
[4]1225      ENDIF
1226!-----
1227      nbfiles = nbfiles+1
1228      filelist(nbfiles) = tmp_str(1:blk)
1229!-----
1230      tmp_str = TRIM(ADJUSTL(tmp_str(blk+1:LEN_TRIM(tmp_str))))
1231      blk = INDEX(tmp_str(1:LEN_TRIM(tmp_str)),' ')
1232    ENDDO
1233!---
1234    IF (nbfiles+1 > max_files) THEN
[11]1235      CALL ipslerr (3,'getin_decrypt', &
1236 &     'Too many files to include',' ',' ')
[4]1237    ENDIF
1238!---
1239    nbfiles =  nbfiles+1
1240    filelist(nbfiles) = TRIM(ADJUSTL(tmp_str))
1241!---
1242    last_key = 'INCLUDEDEF'
1243    nb_lastkey = 1
1244  ELSE
1245!-
1246!-- We are working on a new line of input
1247!-
[536]1248    IF (nb_lines+1 > i_txtsize) THEN
1249      CALL getin_alloctxt ()
1250    ENDIF
[4]1251    nb_lines = nb_lines+1
1252!-
1253!-- First we solve the issue of conpressed information. Once
1254!-- this is done all line can be handled in the same way.
1255!-
1256    starpos = INDEX(NEW_str(1:len_str),'*')
1257    IF ( (starpos > 0).AND.(tmp_str(1:1) /= '"') &
1258 &                    .AND.(tmp_str(1:1) /= "'") ) THEN
1259!-----
[11]1260      IF (INDEX(key_str(1:LEN_TRIM(key_str)),'__') > 0) THEN
1261        CALL ipslerr (3,'getin_decrypt', &
1262 &       'We can not have a compressed field of values', &
1263 &       'in a vector notation (TARGET__n).', &
1264 &       'The key at fault : '//TRIM(key_str))
[4]1265      ENDIF
1266!-
1267!---- Read the multiplied
1268!-
1269      mult = TRIM(ADJUSTL(NEW_str(1:starpos-1)))
1270!---- Construct the new string and its parameters
1271      NEW_str = TRIM(ADJUSTL(NEW_str(starpos+1:len_str)))
1272      len_str = LEN_TRIM(NEW_str)
1273      blk = INDEX(NEW_str(1:len_str),' ')
1274      IF (blk > 1) THEN
[11]1275        CALL ipslerr (2,'getin_decrypt', &
1276 &       'This is a strange behavior','you could report',' ')
[4]1277      ENDIF
[11]1278      WRITE (UNIT=c_fmt,FMT='("(I",I5.5,")")') LEN_TRIM(mult)
1279      READ(UNIT=mult,FMT=c_fmt) compline(nb_lines)
[4]1280!---
1281    ELSE
1282      compline(nb_lines) = -1
1283    ENDIF
1284!-
1285!-- If there is no space wthin the line then the target is a scalar
1286!-- or the element of a properly written vector.
[11]1287!-- (ie of the type TARGET__00001)
[4]1288!-
1289    IF (    (blk <= 1) &
1290 &      .OR.(tmp_str(1:1) == '"') &
1291 &      .OR.(tmp_str(1:1) == "'") ) THEN
1292!-
1293      IF (nb_lastkey == 0) THEN
1294!------ Save info of current keyword as a scalar
1295!------ if it is not a continuation
[11]1296        targetlist(nb_lines) = key_str(1:MIN(LEN_TRIM(key_str),l_n))
1297        last_key = key_str(1:MIN(LEN_TRIM(key_str),l_n))
[4]1298        nb_lastkey = 1
1299      ELSE
1300!------ We are continuing a vector so the keyword needs
1301!------ to get the underscores
[11]1302        WRITE(UNIT=cnt,FMT=c_i_fmt) nb_lastkey+1
[4]1303        targetlist(nb_lines) = &
[11]1304 &        key_str(1:MIN(LEN_TRIM(key_str),l_n-n_d_fmt-2))//'__'//cnt
1305        last_key = &
1306 &        key_str(1:MIN(LEN_TRIM(key_str),l_n-n_d_fmt-2))//'__'//cnt
[4]1307        nb_lastkey = nb_lastkey+1
1308      ENDIF
1309!-----
1310      fichier(nb_lines) = NEW_str(1:len_str)
1311      fromfile(nb_lines) = current
1312    ELSE
1313!-
1314!---- If there are blanks whithin the line then we are dealing
1315!---- with a vector and we need to split it in many entries
[11]1316!---- with the TARGET__n notation.
[4]1317!----
1318!---- Test if the targer is not already a vector target !
1319!-
1320      IF (INDEX(TRIM(key_str),'__') > 0) THEN
[11]1321        CALL ipslerr (3,'getin_decrypt', &
1322 &       'We have found a mixed vector notation (TARGET__n).', &
1323 &       'The key at fault : '//TRIM(key_str),' ')
[4]1324      ENDIF
1325!-
1326      nbve = nb_lastkey
1327      nbve = nbve+1
[11]1328      WRITE(UNIT=cnt,FMT=c_i_fmt) nbve
[4]1329!-
1330      DO WHILE (blk > 0)
1331!-
1332!------ Save the content of target__nbve
1333!-
1334        fichier(nb_lines) = tmp_str(1:blk)
[11]1335        new_key = &
1336 &       key_str(1:MIN(LEN_TRIM(key_str),l_n-n_d_fmt-2))//'__'//cnt
1337        targetlist(nb_lines) = new_key(1:MIN(LEN_TRIM(new_key),l_n))
[4]1338        fromfile(nb_lines) = current
1339!-
1340        tmp_str = TRIM(ADJUSTL(tmp_str(blk+1:LEN_TRIM(tmp_str))))
1341        blk = INDEX(TRIM(tmp_str),' ')
1342!-
[536]1343        IF (nb_lines+1 > i_txtsize) THEN
1344          CALL getin_alloctxt ()
1345        ENDIF
[4]1346        nb_lines = nb_lines+1
1347        nbve = nbve+1
[11]1348        WRITE(UNIT=cnt,FMT=c_i_fmt) nbve
[4]1349!-
1350      ENDDO
1351!-
1352!---- Save the content of the last target
1353!-
1354      fichier(nb_lines) = tmp_str(1:LEN_TRIM(tmp_str))
[11]1355      new_key = &
1356 &      key_str(1:MIN(LEN_TRIM(key_str),l_n-n_d_fmt-2))//'__'//cnt
1357      targetlist(nb_lines) = new_key(1:MIN(LEN_TRIM(new_key),l_n))
[4]1358      fromfile(nb_lines) = current
1359!-
[11]1360      last_key = &
1361 &      key_str(1:MIN(LEN_TRIM(key_str),l_n-n_d_fmt-2))//'__'//cnt
[4]1362      nb_lastkey = nbve
1363!-
1364    ENDIF
1365!-
1366  ENDIF
1367!---------------------------
1368END SUBROUTINE getin_decrypt
1369!-
1370!===
1371!-
1372SUBROUTINE getin_checkcohe ()
1373!---------------------------------------------------------------------
1374!- This subroutine checks for redundancies.
1375!---------------------------------------------------------------------
1376  IMPLICIT NONE
1377!-
[125]1378  INTEGER :: line,n_k,k
[4]1379!---------------------------------------------------------------------
1380  DO line=1,nb_lines-1
1381!-
[125]1382    n_k = 0
1383    DO k=line+1,nb_lines
1384      IF (TRIM(targetlist(line)) == TRIM(targetlist(k))) THEN
1385        n_k = k
1386        EXIT
1387      ENDIF
1388    ENDDO
[4]1389!---
1390!-- IF we have found it we have a problem to solve.
1391!---
[125]1392    IF (n_k > 0) THEN
1393      WRITE(*,*) 'COUNT : ',n_k
[4]1394      WRITE(*,*) &
[125]1395 &  'getin_checkcohe : Found a problem on key ',TRIM(targetlist(line))
[4]1396      WRITE(*,*) &
[125]1397 &  'getin_checkcohe : The following values were encoutered :'
[4]1398      WRITE(*,*) &
[125]1399 &  '                ',TRIM(targetlist(line)),' == ',fichier(line)
[4]1400      WRITE(*,*) &
[125]1401 &  '                ',TRIM(targetlist(k)),' == ',fichier(k)
[4]1402      WRITE(*,*) &
[125]1403 &  'getin_checkcohe : We will keep only the last value'
1404      targetlist(line) = ' '
[4]1405    ENDIF
1406  ENDDO
[11]1407!-----------------------------
[4]1408END SUBROUTINE getin_checkcohe
1409!-
1410!===
1411!-
1412SUBROUTINE getin_skipafew (unit,out_string,eof,nb_lastkey)
1413!---------------------------------------------------------------------
1414  IMPLICIT NONE
1415!-
[11]1416  INTEGER :: unit,eof,nb_lastkey
[4]1417  CHARACTER(LEN=100) :: dummy
1418  CHARACTER(LEN=100) :: out_string
1419  CHARACTER(LEN=1) :: first
1420!---------------------------------------------------------------------
1421  first="#"
1422  eof = 0
1423  out_string = "    "
1424!-
1425  DO WHILE (first == "#")
[11]1426    READ (UNIT=unit,FMT='(A)',ERR=9998,END=7778) dummy
[4]1427    dummy = TRIM(ADJUSTL(dummy))
1428    first=dummy(1:1)
1429    IF (first == "#") THEN
1430      nb_lastkey = 0
1431    ENDIF
1432  ENDDO
1433  out_string=dummy
1434!-
1435  RETURN
1436!-
[11]14379998 CONTINUE
1438  CALL ipslerr (3,'getin_skipafew','Error while reading file',' ',' ')
[4]1439!-
[11]14407778 CONTINUE
1441  eof = 1
[4]1442!----------------------------
1443END SUBROUTINE getin_skipafew
1444!-
1445!===
1446!-
1447SUBROUTINE getin_allockeys ()
1448!---------------------------------------------------------------------
1449  IMPLICIT NONE
1450!-
[125]1451  TYPE(t_key),ALLOCATABLE,DIMENSION(:) :: tmp_key_tab
[4]1452!-
1453  INTEGER :: ier
[11]1454  CHARACTER(LEN=20) :: c_tmp
[4]1455!---------------------------------------------------------------------
1456  IF (keymemsize == 0) THEN
[11]1457!---
[125]1458!-- Nothing exists in memory arrays and it is easy to do.
1459!---
[11]1460    WRITE (UNIT=c_tmp,FMT=*) memslabs
[125]1461    ALLOCATE(key_tab(memslabs),stat=ier)
[4]1462    IF (ier /= 0) THEN
[11]1463      CALL ipslerr (3,'getin_allockeys', &
[125]1464 &     'Can not allocate key_tab', &
[11]1465 &     'to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1466    ENDIF
1467    nb_keys = 0
1468    keymemsize = memslabs
[125]1469    key_tab(:)%keycompress = -1
[11]1470!---
[4]1471  ELSE
[11]1472!---
[4]1473!-- There is something already in the memory,
1474!-- we need to transfer and reallocate.
[11]1475!---
1476    WRITE (UNIT=c_tmp,FMT=*) keymemsize
[125]1477    ALLOCATE(tmp_key_tab(keymemsize),stat=ier)
[4]1478    IF (ier /= 0) THEN
[11]1479      CALL ipslerr (3,'getin_allockeys', &
[125]1480 &     'Can not allocate tmp_key_tab', &
[11]1481 &     'to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1482    ENDIF
[11]1483    WRITE (UNIT=c_tmp,FMT=*) keymemsize+memslabs
[125]1484    tmp_key_tab(1:keymemsize) = key_tab(1:keymemsize)
1485    DEALLOCATE(key_tab)
1486    ALLOCATE(key_tab(keymemsize+memslabs),stat=ier)
[4]1487    IF (ier /= 0) THEN
[11]1488      CALL ipslerr (3,'getin_allockeys', &
[125]1489 &     'Can not allocate key_tab', &
[11]1490 &     'to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1491    ENDIF
[125]1492    key_tab(:)%keycompress = -1
1493    key_tab(1:keymemsize) = tmp_key_tab(1:keymemsize)
1494    DEALLOCATE(tmp_key_tab)
[4]1495    keymemsize = keymemsize+memslabs
1496  ENDIF
1497!-----------------------------
1498END SUBROUTINE getin_allockeys
1499!-
1500!===
1501!-
1502SUBROUTINE getin_allocmem (type,len_wanted)
1503!---------------------------------------------------------------------
1504!- Allocate the memory of the data base for all 4 types of memory
[125]1505!- INTEGER / REAL / CHARACTER / LOGICAL
[4]1506!---------------------------------------------------------------------
1507  IMPLICIT NONE
1508!-
[11]1509  INTEGER :: type,len_wanted
[4]1510!-
1511  INTEGER,ALLOCATABLE :: tmp_int(:)
[125]1512  REAL,ALLOCATABLE :: tmp_real(:)
[4]1513  CHARACTER(LEN=100),ALLOCATABLE :: tmp_char(:)
1514  LOGICAL,ALLOCATABLE :: tmp_logic(:)
1515  INTEGER :: ier
[11]1516  CHARACTER(LEN=20) :: c_tmp
[4]1517!---------------------------------------------------------------------
1518  SELECT CASE (type)
[11]1519  CASE(k_i)
1520    IF (i_memsize == 0) THEN
1521      ALLOCATE(i_mem(memslabs),stat=ier)
[4]1522      IF (ier /= 0) THEN
[11]1523        WRITE (UNIT=c_tmp,FMT=*) memslabs
1524        CALL ipslerr (3,'getin_allocmem', &
1525 &       'Unable to allocate db-memory', &
1526 &       'i_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1527      ENDIF
[11]1528      i_memsize=memslabs
[4]1529    ELSE
[11]1530      ALLOCATE(tmp_int(i_memsize),stat=ier)
[4]1531      IF (ier /= 0) THEN
[11]1532        WRITE (UNIT=c_tmp,FMT=*) i_memsize
1533        CALL ipslerr (3,'getin_allocmem', &
1534 &       'Unable to allocate tmp_int', &
1535 &       'to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1536      ENDIF
[11]1537      tmp_int(1:i_memsize) = i_mem(1:i_memsize)
1538      DEALLOCATE(i_mem)
1539      ALLOCATE(i_mem(i_memsize+MAX(memslabs,len_wanted)),stat=ier)
[4]1540      IF (ier /= 0) THEN
[11]1541        WRITE (UNIT=c_tmp,FMT=*) i_memsize+MAX(memslabs,len_wanted)
1542        CALL ipslerr (3,'getin_allocmem', &
1543 &       'Unable to re-allocate db-memory', &
1544 &       'i_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1545      ENDIF
[11]1546      i_mem(1:i_memsize) = tmp_int(1:i_memsize)
1547      i_memsize = i_memsize+MAX(memslabs,len_wanted)
[4]1548      DEALLOCATE(tmp_int)
1549    ENDIF
[11]1550  CASE(k_r)
1551    IF (r_memsize == 0) THEN
1552      ALLOCATE(r_mem(memslabs),stat=ier)
[4]1553      IF (ier /= 0) THEN
[11]1554        WRITE (UNIT=c_tmp,FMT=*) memslabs
1555        CALL ipslerr (3,'getin_allocmem', &
1556 &       'Unable to allocate db-memory', &
1557 &       'r_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1558      ENDIF
[11]1559      r_memsize =  memslabs
[4]1560    ELSE
[11]1561      ALLOCATE(tmp_real(r_memsize),stat=ier)
[4]1562      IF (ier /= 0) THEN
[11]1563        WRITE (UNIT=c_tmp,FMT=*) r_memsize
1564        CALL ipslerr (3,'getin_allocmem', &
1565 &       'Unable to allocate tmp_real', &
1566 &       'to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1567      ENDIF
[11]1568      tmp_real(1:r_memsize) = r_mem(1:r_memsize)
1569      DEALLOCATE(r_mem)
1570      ALLOCATE(r_mem(r_memsize+MAX(memslabs,len_wanted)),stat=ier)
[4]1571      IF (ier /= 0) THEN
[11]1572        WRITE (UNIT=c_tmp,FMT=*) r_memsize+MAX(memslabs,len_wanted)
1573        CALL ipslerr (3,'getin_allocmem', &
1574 &       'Unable to re-allocate db-memory', &
1575 &       'r_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1576      ENDIF
[11]1577      r_mem(1:r_memsize) = tmp_real(1:r_memsize)
1578      r_memsize = r_memsize+MAX(memslabs,len_wanted)
[4]1579      DEALLOCATE(tmp_real)
1580    ENDIF
[11]1581  CASE(k_c)
1582    IF (c_memsize == 0) THEN
1583      ALLOCATE(c_mem(memslabs),stat=ier)
[4]1584      IF (ier /= 0) THEN
[11]1585        WRITE (UNIT=c_tmp,FMT=*) memslabs
1586        CALL ipslerr (3,'getin_allocmem', &
1587 &       'Unable to allocate db-memory', &
1588 &       'c_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1589      ENDIF
[11]1590      c_memsize = memslabs
[4]1591    ELSE
[11]1592      ALLOCATE(tmp_char(c_memsize),stat=ier)
[4]1593      IF (ier /= 0) THEN
[11]1594        WRITE (UNIT=c_tmp,FMT=*) c_memsize
1595        CALL ipslerr (3,'getin_allocmem', &
1596 &       'Unable to allocate tmp_char', &
1597 &       'to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1598      ENDIF
[11]1599      tmp_char(1:c_memsize) = c_mem(1:c_memsize)
1600      DEALLOCATE(c_mem)
1601      ALLOCATE(c_mem(c_memsize+MAX(memslabs,len_wanted)),stat=ier)
[4]1602      IF (ier /= 0) THEN
[11]1603        WRITE (UNIT=c_tmp,FMT=*) c_memsize+MAX(memslabs,len_wanted)
1604        CALL ipslerr (3,'getin_allocmem', &
1605 &       'Unable to re-allocate db-memory', &
1606 &       'c_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1607      ENDIF
[11]1608      c_mem(1:c_memsize) = tmp_char(1:c_memsize)
1609      c_memsize = c_memsize+MAX(memslabs,len_wanted)
[4]1610      DEALLOCATE(tmp_char)
1611    ENDIF
[11]1612  CASE(k_l)
1613    IF (l_memsize == 0) THEN
1614      ALLOCATE(l_mem(memslabs),stat=ier)
[4]1615      IF (ier /= 0) THEN
[11]1616        WRITE (UNIT=c_tmp,FMT=*) memslabs
1617        CALL ipslerr (3,'getin_allocmem', &
1618 &       'Unable to allocate db-memory', &
1619 &       'l_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1620      ENDIF
[11]1621      l_memsize = memslabs
[4]1622    ELSE
[11]1623      ALLOCATE(tmp_logic(l_memsize),stat=ier)
[4]1624      IF (ier /= 0) THEN
[11]1625        WRITE (UNIT=c_tmp,FMT=*) l_memsize
1626        CALL ipslerr (3,'getin_allocmem', &
1627 &       'Unable to allocate tmp_logic', &
1628 &       'to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1629      ENDIF
[11]1630      tmp_logic(1:l_memsize) = l_mem(1:l_memsize)
1631      DEALLOCATE(l_mem)
1632      ALLOCATE(l_mem(l_memsize+MAX(memslabs,len_wanted)),stat=ier)
[4]1633      IF (ier /= 0) THEN
[11]1634        WRITE (UNIT=c_tmp,FMT=*) l_memsize+MAX(memslabs,len_wanted)
1635        CALL ipslerr (3,'getin_allocmem', &
1636 &       'Unable to re-allocate db-memory', &
1637 &       'l_mem to size '//TRIM(ADJUSTL(c_tmp)),' ')
[4]1638      ENDIF
[11]1639      l_mem(1:l_memsize) = tmp_logic(1:l_memsize)
1640      l_memsize = l_memsize+MAX(memslabs,len_wanted)
[4]1641      DEALLOCATE(tmp_logic)
1642    ENDIF
1643  CASE DEFAULT
[11]1644    CALL ipslerr (3,'getin_allocmem','Unknown type of data',' ',' ')
[4]1645  END SELECT
1646!----------------------------
1647END SUBROUTINE getin_allocmem
1648!-
1649!===
1650!-
[536]1651SUBROUTINE getin_alloctxt ()
1652!---------------------------------------------------------------------
1653  IMPLICIT NONE
1654!-
1655  CHARACTER(LEN=100),ALLOCATABLE :: tmp_fic(:)
1656  CHARACTER(LEN=l_n),ALLOCATABLE :: tmp_tgl(:)
1657  INTEGER,ALLOCATABLE :: tmp_int(:)
1658!-
1659  INTEGER :: ier
1660  CHARACTER(LEN=20) :: c_tmp1,c_tmp2
1661!---------------------------------------------------------------------
1662  IF (i_txtsize == 0) THEN
1663!---
1664!-- Nothing exists in memory arrays and it is easy to do.
1665!---
1666    WRITE (UNIT=c_tmp1,FMT=*) i_txtslab
1667    ALLOCATE(fichier(i_txtslab),stat=ier)
1668    IF (ier /= 0) THEN
1669      CALL ipslerr (3,'getin_alloctxt', &
1670 &     'Can not allocate fichier', &
1671 &     'to size '//TRIM(ADJUSTL(c_tmp1)),' ')
1672    ENDIF
1673!---
1674    ALLOCATE(targetlist(i_txtslab),stat=ier)
1675    IF (ier /= 0) THEN
1676      CALL ipslerr (3,'getin_alloctxt', &
1677 &     'Can not allocate targetlist', &
1678 &     'to size '//TRIM(ADJUSTL(c_tmp1)),' ')
1679    ENDIF
1680!---
1681    ALLOCATE(fromfile(i_txtslab),stat=ier)
1682    IF (ier /= 0) THEN
1683      CALL ipslerr (3,'getin_alloctxt', &
1684 &     'Can not allocate fromfile', &
1685 &     'to size '//TRIM(ADJUSTL(c_tmp1)),' ')
1686    ENDIF
1687!---
1688    ALLOCATE(compline(i_txtslab),stat=ier)
1689    IF (ier /= 0) THEN
1690      CALL ipslerr (3,'getin_alloctxt', &
1691 &     'Can not allocate compline', &
1692 &     'to size '//TRIM(ADJUSTL(c_tmp1)),' ')
1693    ENDIF
1694!---
1695    nb_lines = 0
1696    i_txtsize = i_txtslab
1697  ELSE
1698!---
1699!-- There is something already in the memory,
1700!-- we need to transfer and reallocate.
1701!---
1702    WRITE (UNIT=c_tmp1,FMT=*) i_txtsize
1703    WRITE (UNIT=c_tmp2,FMT=*) i_txtsize+i_txtslab
1704    ALLOCATE(tmp_fic(i_txtsize),stat=ier)
1705    IF (ier /= 0) THEN
1706      CALL ipslerr (3,'getin_alloctxt', &
1707 &     'Can not allocate tmp_fic', &
1708 &     'to size '//TRIM(ADJUSTL(c_tmp1)),' ')
1709    ENDIF
1710    tmp_fic(1:i_txtsize) = fichier(1:i_txtsize)
1711    DEALLOCATE(fichier)
1712    ALLOCATE(fichier(i_txtsize+i_txtslab),stat=ier)
1713    IF (ier /= 0) THEN
1714      CALL ipslerr (3,'getin_alloctxt', &
1715 &     'Can not allocate fichier', &
1716 &     'to size '//TRIM(ADJUSTL(c_tmp2)),' ')
1717    ENDIF
1718    fichier(1:i_txtsize) = tmp_fic(1:i_txtsize)
1719    DEALLOCATE(tmp_fic)
1720!---
1721    ALLOCATE(tmp_tgl(i_txtsize),stat=ier)
1722    IF (ier /= 0) THEN
1723      CALL ipslerr (3,'getin_alloctxt', &
1724 &     'Can not allocate tmp_tgl', &
1725 &     'to size '//TRIM(ADJUSTL(c_tmp1)),' ')
1726    ENDIF
1727    tmp_tgl(1:i_txtsize) = targetlist(1:i_txtsize)
1728    DEALLOCATE(targetlist)
1729    ALLOCATE(targetlist(i_txtsize+i_txtslab),stat=ier)
1730    IF (ier /= 0) THEN
1731      CALL ipslerr (3,'getin_alloctxt', &
1732 &     'Can not allocate targetlist', &
1733 &     'to size '//TRIM(ADJUSTL(c_tmp2)),' ')
1734    ENDIF
1735    targetlist(1:i_txtsize) = tmp_tgl(1:i_txtsize)
1736    DEALLOCATE(tmp_tgl)
1737!---
1738    ALLOCATE(tmp_int(i_txtsize),stat=ier)
1739    IF (ier /= 0) THEN
1740      CALL ipslerr (3,'getin_alloctxt', &
1741 &     'Can not allocate tmp_int', &
1742 &     'to size '//TRIM(ADJUSTL(c_tmp1)),' ')
1743    ENDIF
1744    tmp_int(1:i_txtsize) = fromfile(1:i_txtsize)
1745    DEALLOCATE(fromfile)
1746    ALLOCATE(fromfile(i_txtsize+i_txtslab),stat=ier)
1747    IF (ier /= 0) THEN
1748      CALL ipslerr (3,'getin_alloctxt', &
1749 &     'Can not allocate fromfile', &
1750 &     'to size '//TRIM(ADJUSTL(c_tmp2)),' ')
1751    ENDIF
1752    fromfile(1:i_txtsize) = tmp_int(1:i_txtsize)
1753!---
1754    tmp_int(1:i_txtsize) = compline(1:i_txtsize)
1755    DEALLOCATE(compline)
1756    ALLOCATE(compline(i_txtsize+i_txtslab),stat=ier)
1757    IF (ier /= 0) THEN
1758      CALL ipslerr (3,'getin_alloctxt', &
1759 &     'Can not allocate compline', &
1760 &     'to size '//TRIM(ADJUSTL(c_tmp2)),' ')
1761    ENDIF
1762    compline(1:i_txtsize) = tmp_int(1:i_txtsize)
1763    DEALLOCATE(tmp_int)
1764!---
1765    i_txtsize = i_txtsize+i_txtslab
1766  ENDIF
1767!----------------------------
1768END SUBROUTINE getin_alloctxt
1769!-
1770!===
1771!-
[4]1772SUBROUTINE getin_dump (fileprefix)
1773!---------------------------------------------------------------------
1774  IMPLICIT NONE
1775!-
1776  CHARACTER(*),OPTIONAL :: fileprefix
1777!-
[11]1778  CHARACTER(LEN=80) :: usedfileprefix
[4]1779  INTEGER :: ikey,if,iff,iv
[11]1780  CHARACTER(LEN=20) :: c_tmp
1781  CHARACTER(LEN=100) :: tmp_str,used_filename
[4]1782  LOGICAL :: check = .FALSE.
1783!---------------------------------------------------------------------
1784  IF (PRESENT(fileprefix)) THEN
[11]1785    usedfileprefix = fileprefix(1:MIN(LEN_TRIM(fileprefix),80))
1786  ELSE
1787    usedfileprefix = "used"
[4]1788  ENDIF
1789!-
1790  DO if=1,nbfiles
1791!---
1792    used_filename = TRIM(usedfileprefix)//'_'//TRIM(filelist(if))
1793    IF (check) THEN
1794      WRITE(*,*) &
1795 &      'GETIN_DUMP : opens file : ',TRIM(used_filename),' if = ',if
1796      WRITE(*,*) 'GETIN_DUMP : NUMBER OF KEYS : ',nb_keys
1797    ENDIF
[11]1798    OPEN (UNIT=22,FILE=used_filename)
1799!---
[4]1800!-- If this is the first file we need to add the list
1801!-- of file which belong to it
[11]1802    IF ( (if == 1).AND.(nbfiles > 1) ) THEN
1803      WRITE(22,*) '# '
1804      WRITE(22,*) '# This file is linked to the following files :'
1805      WRITE(22,*) '# '
[4]1806      DO iff=2,nbfiles
[11]1807        WRITE(22,*) 'INCLUDEDEF = ',TRIM(filelist(iff))
[4]1808      ENDDO
[11]1809      WRITE(22,*) '# '
[4]1810    ENDIF
1811!---
1812    DO ikey=1,nb_keys
[11]1813!-----
1814!---- Is this key from this file ?
[125]1815      IF (key_tab(ikey)%keyfromfile == if) THEN
[11]1816!-------
1817!------ Write some comments
1818        WRITE(22,*) '#'
[125]1819        SELECT CASE (key_tab(ikey)%keystatus)
[4]1820        CASE(1)
[11]1821          WRITE(22,*) '# Values of ', &
[963]1822 &          TRIM(key_tab(ikey)%keystr),' comes from ',TRIM(def_file)
[4]1823        CASE(2)
[11]1824          WRITE(22,*) '# Values of ', &
[125]1825 &          TRIM(key_tab(ikey)%keystr),' are all defaults.'
[4]1826        CASE(3)
[11]1827          WRITE(22,*) '# Values of ', &
[125]1828 &          TRIM(key_tab(ikey)%keystr), &
[963]1829 &          ' are a mix of ',TRIM(def_file),' and defaults.'
[4]1830        CASE DEFAULT
[11]1831          WRITE(22,*) '# Dont know from where the value of ', &
[125]1832 &          TRIM(key_tab(ikey)%keystr),' comes.'
[4]1833        END SELECT
[11]1834        WRITE(22,*) '#'
1835!-------
1836!------ Write the values
[125]1837        SELECT CASE (key_tab(ikey)%keytype)
[11]1838        CASE(k_i)
[125]1839          IF (key_tab(ikey)%keymemlen == 1) THEN
1840            IF (key_tab(ikey)%keycompress < 0) THEN
[11]1841              WRITE(22,*) &
[125]1842 &              TRIM(key_tab(ikey)%keystr), &
1843 &              ' = ',i_mem(key_tab(ikey)%keymemstart)
[4]1844            ELSE
[11]1845              WRITE(22,*) &
[125]1846 &              TRIM(key_tab(ikey)%keystr), &
1847 &              ' = ',key_tab(ikey)%keycompress, &
1848 &              ' * ',i_mem(key_tab(ikey)%keymemstart)
[4]1849            ENDIF
1850          ELSE
[125]1851            DO iv=0,key_tab(ikey)%keymemlen-1
[11]1852              WRITE(UNIT=c_tmp,FMT=c_i_fmt) iv+1
1853              WRITE(22,*) &
[125]1854 &              TRIM(key_tab(ikey)%keystr), &
1855 &              '__',TRIM(ADJUSTL(c_tmp)), &
1856 &              ' = ',i_mem(key_tab(ikey)%keymemstart+iv)
[4]1857            ENDDO
1858          ENDIF
[11]1859        CASE(k_r)
[125]1860          IF (key_tab(ikey)%keymemlen == 1) THEN
1861            IF (key_tab(ikey)%keycompress < 0) THEN
[11]1862              WRITE(22,*) &
[125]1863 &              TRIM(key_tab(ikey)%keystr), &
1864 &              ' = ',r_mem(key_tab(ikey)%keymemstart)
[4]1865            ELSE
[11]1866              WRITE(22,*) &
[125]1867 &              TRIM(key_tab(ikey)%keystr), &
1868 &              ' = ',key_tab(ikey)%keycompress, &
1869                   & ' * ',r_mem(key_tab(ikey)%keymemstart)
[4]1870            ENDIF
1871          ELSE
[125]1872            DO iv=0,key_tab(ikey)%keymemlen-1
[11]1873              WRITE(UNIT=c_tmp,FMT=c_i_fmt) iv+1
1874              WRITE(22,*) &
[125]1875 &              TRIM(key_tab(ikey)%keystr),'__',TRIM(ADJUSTL(c_tmp)), &
1876 &              ' = ',r_mem(key_tab(ikey)%keymemstart+iv)
[4]1877            ENDDO
1878          ENDIF
[11]1879        CASE(k_c)
[125]1880          IF (key_tab(ikey)%keymemlen == 1) THEN
1881            tmp_str = c_mem(key_tab(ikey)%keymemstart)
1882            WRITE(22,*) TRIM(key_tab(ikey)%keystr), &
1883 &              ' = ',TRIM(tmp_str)
[4]1884          ELSE
[125]1885            DO iv=0,key_tab(ikey)%keymemlen-1
[11]1886              WRITE(UNIT=c_tmp,FMT=c_i_fmt) iv+1
[125]1887              tmp_str = c_mem(key_tab(ikey)%keymemstart+iv)
[11]1888              WRITE(22,*) &
[125]1889 &              TRIM(key_tab(ikey)%keystr), &
1890 &              '__',TRIM(ADJUSTL(c_tmp)), &
[11]1891 &              ' = ',TRIM(tmp_str)
[4]1892            ENDDO
1893          ENDIF
[11]1894        CASE(k_l)
[125]1895          IF (key_tab(ikey)%keymemlen == 1) THEN
1896            IF (l_mem(key_tab(ikey)%keymemstart)) THEN
1897              WRITE(22,*) TRIM(key_tab(ikey)%keystr),' = TRUE '
[4]1898            ELSE
[125]1899              WRITE(22,*) TRIM(key_tab(ikey)%keystr),' = FALSE '
[4]1900            ENDIF
1901          ELSE
[125]1902            DO iv=0,key_tab(ikey)%keymemlen-1
[11]1903              WRITE(UNIT=c_tmp,FMT=c_i_fmt) iv+1
[125]1904              IF (l_mem(key_tab(ikey)%keymemstart+iv)) THEN
1905                WRITE(22,*) TRIM(key_tab(ikey)%keystr),'__', &
[11]1906 &                          TRIM(ADJUSTL(c_tmp)),' = TRUE '
[4]1907              ELSE
[125]1908                WRITE(22,*) TRIM(key_tab(ikey)%keystr),'__', &
[11]1909 &                          TRIM(ADJUSTL(c_tmp)),' = FALSE '
[4]1910              ENDIF
1911            ENDDO
1912          ENDIF
1913        CASE DEFAULT
[11]1914          CALL ipslerr (3,'getin_dump', &
[125]1915 &         'Unknown type for variable '//TRIM(key_tab(ikey)%keystr), &
1916 &         ' ',' ')
[4]1917        END SELECT
1918      ENDIF
1919    ENDDO
1920!-
[11]1921    CLOSE(UNIT=22)
[4]1922!-
1923  ENDDO
1924!------------------------
1925END SUBROUTINE getin_dump
[11]1926!===
1927SUBROUTINE get_qtyp (k_typ,c_vtyp,i_v,r_v,c_v,l_v)
1928!---------------------------------------------------------------------
1929!- Returns the type of the argument (mutually exclusive)
1930!---------------------------------------------------------------------
1931  IMPLICIT NONE
[4]1932!-
[11]1933  INTEGER,INTENT(OUT) :: k_typ
1934  CHARACTER(LEN=*),INTENT(OUT) :: c_vtyp
1935  INTEGER,DIMENSION(:),OPTIONAL          :: i_v
1936  REAL,DIMENSION(:),OPTIONAL             :: r_v
1937  LOGICAL,DIMENSION(:),OPTIONAL          :: l_v
1938  CHARACTER(LEN=*),DIMENSION(:),OPTIONAL :: c_v
1939!---------------------------------------------------------------------
1940  k_typ = 0
1941  IF (COUNT((/PRESENT(i_v),PRESENT(r_v),PRESENT(c_v),PRESENT(l_v)/)) &
1942 &    /= 1) THEN
1943    CALL ipslerr (3,'get_qtyp', &
1944 &   'Invalid number of optional arguments','(/= 1)',' ')
1945  ENDIF
1946!-
1947  IF     (PRESENT(i_v)) THEN
1948    k_typ = k_i
1949    c_vtyp = 'INTEGER'
1950  ELSEIF (PRESENT(r_v)) THEN
1951    k_typ = k_r
1952    c_vtyp = 'REAL'
1953  ELSEIF (PRESENT(c_v)) THEN
1954    k_typ = k_c
1955    c_vtyp = 'CHARACTER'
1956  ELSEIF (PRESENT(l_v)) THEN
1957    k_typ = k_l
1958    c_vtyp = 'LOGICAL'
1959  ENDIF
1960!----------------------
1961END SUBROUTINE get_qtyp
[4]1962!===
[125]1963SUBROUTINE get_findkey (i_tab,c_key,pos)
1964!---------------------------------------------------------------------
1965!- This subroutine looks for a key in a table
1966!---------------------------------------------------------------------
1967!- INPUT
1968!-   i_tab  : 1 -> search in key_tab(1:nb_keys)%keystr
1969!-            2 -> search in targetlist(1:nb_lines)
1970!-   c_key  : Name of the key we are looking for
1971!- OUTPUT
1972!-   pos    : -1 if key not found, else value in the table
1973!---------------------------------------------------------------------
1974  IMPLICIT NONE
1975!-
1976  INTEGER,INTENT(in) :: i_tab
1977  CHARACTER(LEN=*),INTENT(in) :: c_key
1978  INTEGER,INTENT(out) :: pos
1979!-
1980  INTEGER :: ikey_max,ikey
1981  CHARACTER(LEN=l_n) :: c_q_key
1982!---------------------------------------------------------------------
1983  pos = -1
1984  IF     (i_tab == 1) THEN
1985    ikey_max = nb_keys
1986  ELSEIF (i_tab == 2) THEN
1987    ikey_max = nb_lines
1988  ELSE
1989    ikey_max = 0
1990  ENDIF
1991  IF ( ikey_max > 0 ) THEN
1992    DO ikey=1,ikey_max
1993      IF (i_tab == 1) THEN
1994        c_q_key = key_tab(ikey)%keystr
1995      ELSE
1996        c_q_key = targetlist(ikey)
1997      ENDIF
1998      IF (TRIM(c_q_key) == TRIM(c_key)) THEN
1999        pos = ikey
2000        EXIT
2001      ENDIF
2002    ENDDO
2003  ENDIF
2004!-------------------------
2005END SUBROUTINE get_findkey
2006!===
[11]2007!------------------
[4]2008END MODULE getincom
Note: See TracBrowser for help on using the repository browser.