source: LMDZ.3.3/trunk/makegcm @ 100

Last change on this file since 100 was 76, checked in by lmdz, 25 years ago

Probleme avec les liens
LF

  • Property svn:eol-style set to native
  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 19.9 KB
Line 
1#!/bin/csh
2#set verbose echo
3########################################################################
4# options par defaut pour la commande make
5########################################################################
6set dim="48x32x19"
7set physique=lmd
8set phys="PHYS=$physique"
9set include='-I$(LIBF)/grid -I$(LIBF)/bibio -I. '
10set ntrac = 4
11set filtre=filtrez
12set grille=reg
13########################################################################
14# path a changer contenant les sources et les objets du modele
15########################################################################
16
17###### VERSION LMDZ.3.3
18# set LMDGCM=$HOME/LMDZ.3.3
19#
20#   a changer  rlmd304/agcm
21#
22###### VERSION LMDZ.3.2
23
24if ( ! $?LMDGCM ) then
25   echo You must initialize the variable LMDGCM in your environnement
26   echo for instance: "setenv LMDGCM /usr/myself/supergcm" in .cshrc
27   exit
28endif
29if ( ! $?LIBOGCM ) then
30   set LIBOGCM=$LMDGCM/libo
31endif
32if ( ! $?IOIPSLDIR ) then
33   echo You must initialize the variable IOIPSLDIR in your environnement
34   echo for instance: "setenv IOIPSLDIR /usr/myself/ioipsl" in .cshrc
35   exit
36endif
37if ( ! $?NCDFLIB ) then
38   echo You must initialize the variable NCDFLIB in your environnement
39   echo for instance: "setenv NCDFLIB /usr/myself/netcdf" in .cshrc
40   exit
41endif
42if ( ! $?NCDFINC ) then
43   echo You must initialize the variable NCDFINC in your environnement
44   echo for instance: "setenv NCDFINC /usr/myself/netcdf" in .cshrc
45   exit
46endif
47set model=$LMDGCM
48set libo=$LIBOGCM
49
50########################################################################
51#  Les differentes platformes reconnues
52########################################################################
53
54set HP=0
55set IBM=0
56set SUN=0
57set VPP=0
58set CRAY=0
59set DEC=0
60set LINUX=0
61set NEC=0
62if ( `uname` == HP-UX ) then
63   set machine=HP
64   set HP=1
65else if (`uname` == UNIX_System_V ) then
66   set machine=VPP
67   set VPP=1
68else if (`uname` == SunOS ) then
69   set machine=SUN
70   set SUN=1
71else if ( `uname` == AIX ) then
72   set machine=IBM
73   set IBM=1
74else if ( `uname` == OSF1 ) then
75   set machine=ALPHA
76   set DEC=1
77else if ( `uname` == Linux ) then
78   set machine=LINUX
79   set LINUX=1
80else if ( `hostname` == atlas || `hostname` == axis  || `hostname` == etoile ) then
81   set machine=CRAY
82   set CRAY=1
83else if ( `uname` == SUPER-UX ) then
84   set machine=NEC
85   set NEC=1
86else
87   echo Vous travaillez sur une machine non prevue par le reglement
88   exit
89endif
90
91if ( ! -d $libo )  then
92   mkdir $libo
93endif
94
95
96if $VPP then
97set netcdf=netcdf_v
98else
99set netcdf=netcdf
100endif
101########################################################################
102#  Quelques initialisations de variables du shell.
103########################################################################
104
105set dyn=
106set opt_link=""
107set adjnt=""
108set opt_dep=""
109
110set optim=""
111set optimbis=""
112set optim90=""
113set oplink=""
114
115########################################################################
116#  Optimisations par defaut suivant les machines
117########################################################################
118
119echo "Optimisations par defaut suivant les machines"
120set libf=$model/libf
121#setenv localdir "LOCAL_DIR=`pwd`"
122setenv localdir "`pwd`"
123cd $model
124if $CRAY then
125#   set optim="-Wf'-ei' -dp -Wf'-a static'"
126   set optimbis=" -DCRAY "
127   set optim90="-Wp'-P' -DCRAY -p$IOIPSLDIR "'-p$(LIBO) -eiv '
128   set optim="$optim90"
129   set oplink="-Wl'-DSTACK=128 -f indef' -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf "
130   set mod_loc_dir=" "
131   set mod_suffix=" "
132else if $SUN then
133   set optim=" -fast "
134   set optimbis=" "
135   set optim90=" -fast -fixed "
136   set opt_link="-lf77compat -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf"
137   set mod_loc_dir=$localdir
138   set mod_suffix=mod
139else if $HP then
140   set optim=" +U77 -O +E1 "
141   set optimbis=" "
142else if $IBM then
143   set optim=" -O3 -qtune=pwr2 -qarch=pwr2"
144   set optimbis=" "
145else if $VPP then
146#   set optim="-Dasuxm  -On, -g -Ad -Potilax -Eciplume -Si"
147#   set optimbis="  -Wv,-m3 -Wp,-DVPP -Z $LMDGCM/listage"
148   set optimbis=" -Z $LMDGCM/listage"
149   set optim90="$optim $optimbis -w"
150   set opt_link="-Wg,-c -L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf"
151   set oplink=" "
152   set mod_loc_dir=$IOIPSLDIR
153   set mod_suffix=mod
154else if $DEC then
155   set optim=" "
156   set optimbis=" "
157else if $LINUX then
158   set optim="-fast "
159   set optim90=" -fast -module $libo"
160   set opt_link=" -Mfree -L/usr/local/pgi/linux86/lib -lpgf90 -lpgftnrtl -lpghpf -lpghpf2 -L$NCDFLIB -lnetcdf -L$IOIPSLDIR -lioipsl -Wl,-Bstatic "
161   set mod_loc_dir=$IOIPSLDIR
162   set mod_suffix=mod
163else if $NEC then
164   set optim90=' -clear -C hopt -float0 -ew -P stack -Wf,"-pvctl fullmsg noassume "'
165   set optim="$optim90"
166   set optimbis=" "
167   set opt_link=" -C hopt -float0 -ew -P stack -L$IOIPSLDIR -lioipsl  -L/u/rech/psl/rpsl003/IOIPSL -lnetcdf_i8r8_v "
168   set mod_loc_dir="."
169   set mod_suffix="mod"
170else
171   set optim=""
172   set optimbis=" "
173endif
174
175set nomlib=$machine
176
177########################################################################
178# lecture des options de mymake
179########################################################################
180
181top:
182if ($#argv > 0) then
183    switch ($1:q)
184
185    case -h:
186
187########################################################################
188# Manuel en ligne
189########################################################################
190more <<eod
191
192
193makegcm [Options] prog
194
195
196
197
198Par default, la commande makegcm:
199---------------------------------
200
2011. compile une serie de sous programmes se trouvant dans des sous-repertoires
202de $LMDGCM/libf.
203Les sous programmes sont ensuite stokes sur dans des librairies FORTRAN
204sur $LIBOGCM.
205
2062. Ensuite, makegcm compile le programme prog.f se trouvant par default sur
207$LMDGCM/libf/dyn3d et effectue le lien avec l ensemble des librairies.
208
209La variable '$LMDGCM' doit etre initialisee dans votre .cshrc ou en dur
210dans la comande makegcm.
211
212La commande makegcm est faite pour permettre de gerer en parallele des
213versions differentes du modele, compilees avec des options de compilation
214et des dimensions differentes sans avoir a chaque fois a recompiler tout
215le modele.
216
217Les librairies FORTRAN sont stoquees sur le directory $LIBOGCM.
218
219
220OPTIONS:
221--------
222
223Les options suivantes peuvent etre definies soit par defaut en editant le
224"script" makegcm, soit en interactif:
225
226-d imxjmxlm  ou im, jm, et lm sont resp. le nombre de longitudes, latitudes
227             et couches verticales.
228
229-t ntrac   selectionne le nombre de traceur advectes par la dynamique.
230           Dans les versions courantes du modele terrestre on a par exemple
231           ntrac=2 pour l'eau vapeur et liquide
232
233             L'effet des options -d et -t est d'ecraser le fichier
234             $LMDGCM/libf/grid/dimensions.h
235             qui contient sous forme de 4 PARAMETER FORTRAN les 3 dimensions
236             de la grille horizontale im, jm, lm plus le nombre de traceurs
237             advectes passivement par la dynamique ntrac, par un nouveu fichier
238             $LMDGCM/libf/grid/dimension/dimensions.im.jm.lm.tntrac
239             Si ce fichier n'existe pas encore, il est cree par le script
240             $LMDGCM/libf/grid/dimension/makdim
241
242-p PHYS    pour selectionner le jeu de parametrisations physiques avec
243           lequel on veut compiler le modele.
244           Le modele sera alors compile en prenant les sources des
245           parametrisations physiques dans le repertoire:
246            $LMDGCM/libf/phyPHYS
247
248-g grille  selectionne le type de grille qu'on veut utiliser.
249           L'effet de cette option est d'ecraser le fichier
250           $LMDGCM/libf/grid/fxyprim.h
251           avec le fichier
252           $LMDGCM/libf/grid/fxy_grille.h
253           grille peut prendre les valeurs:
254           1. reg pour la grille reguliere
255           2. sin pour avoir des points equidistants en sinus de la latitude
256           3. new pour pouvoir zoomer sur une partie du globe
257
258-O "optimisation fortran" ou les optimisations fortran sont les options de la
259            commande f77
260
261-include path
262           Dans le cas ou on a dans des sous programmes des fichiers
263           #include (cpp) qui se trouve sur des repertoires non references
264           par defaut
265
266-adjnt     Pour compiler la l'adjoint du code dynamique
267
268-filtre  filtre
269           Pour choisir le filtre en longitude dans les regions polaires.
270           "filtre" correspond au nom d'un repertoire se trouvant sur
271           $LMDGCM/libf. Le filtre standard du modele est "filtrez" qui peut
272           etre utilise aussi bien pour une grille reguliere que pour une
273           grille zoomee en longitude.
274
275-link "-Ldir1 -lfile1 -Ldir2 -lfile2 ..."
276          Pour rajouter un lien avec les librairies FORTRAN
277          libfile1.a, libfile2.a ... se trouvant respectivement sur les
278          repertoires dir1, dir2 ...
279          Si dirn est un repertoire dont le chemin est automatique (comme
280          par exemple /usr/lib ...) il n'est pas besoin de specifier -Ldirn.
281
282Auteur: Frederic Hourdin  (hourdin@lmd.jussieu.fr)
283eod
284exit
285
286########################################################################
287# Lecture des differentes options
288########################################################################
289
290    case -d:
291        set dim=$2 ; shift ; shift ; goto top
292                       
293    case -O:
294        set optim="$2" ; shift ; shift ; goto top
295
296     case -p
297        set physique="$2" ; set phys="PHYS=$physique" ; shift ; shift ; goto top
298
299     case -g
300        set grille="$2" ; shift ; shift ; goto top
301
302     case -t
303        set ntrac=$2 ; shift ; shift ; goto top
304
305     case -include
306        set include="$include -I$2" ; shift ; shift ; goto top
307
308     case -adjnt
309        set opt_dep="$opt_dep adjnt" ; set adjnt="-ladjnt -ldyn3d "
310        set optim="$optim -Dadj" ; shift ; goto top
311
312     case -filtre
313        set filtre=$2 ; shift ; shift ; goto top
314
315     case -link
316        set opt_link="$opt_link $2" ; shift ; shift ; goto top
317
318     case -debug
319        if $HP then
320           set optim=" -g "
321        else if $SUN then
322           setenv PARALLEL 2
323           set optim=" -g -C "
324           set optim90=" -fixed -g "
325        else if $CRAY then
326           set optim="$optim"" -g "
327           set optim90="$optim90"" -G1 "
328        else if $LINUX then
329           set optim="$optim"" -g -Mbounds "
330           set optim90="$optim90"" -g -Mbounds "
331        else
332           echo pas d option debug predefinie pour cette machine
333           exit
334        endif
335        shift ; goto top
336
337     default
338        set code="$1" ; shift ; goto top
339
340   endsw
341endif
342
343########################################################################
344# cas special sans physique
345########################################################################
346if ( "$physique" == 'nophys' ) then
347   set phys="L_PHY= LIBPHY="
348endif
349
350########################################################################
351# choix du nombre de traceur par defaut si il n'a pas ete choisi,
352# suivant la physique
353########################################################################
354
355if ( $ntrac == 0  ) then
356    if ( "$physique" == 'nophys' ) then
357        set ntrac=1
358    else if ( "$physique" == 'lmd' ) then
359        set ntrac=2
360    else if ( "$physique" == 'lmd_test_li' ) then
361        set ntrac=2
362    else if ( "$physique" == 'ec' ) then
363        set ntrac=1
364    else
365        set ntrac = 1
366    endif
367endif
368
369########################################################################
370#subtilites sur le nom de la librairie
371########################################################################
372
373\rm tmp ; touch tmp
374\rm tmp90 ; touch tmp90
375foreach i ( $optim )
376   echo $i | sed -e 's/\"//g' -e "s/\'//g" -e 's/-//g'  >> tmp
377end
378set suf=
379foreach i ( `sort tmp | uniq ` )
380   set suf=$suf$i
381end
382if ( ! $IBM ) then
383   set nomlib="$nomlib$suf"
384endif
385if ( $DEC ) then
386   set nomlib=DEC
387endif
388if ( $IBM ) then
389   set dim=`echo $dim | sed -en 's/[^0-9]/ /g'`
390   set dim_=`echo $dim | sed -en 's/[^0-9]/_/g'`
391else if ( $SUN ) then
392   set dim=`echo $dim | sed -e 's/[^0-9]/ /g'` 
393   set dim_=`echo $dim | sed -e 's/[^0-9]/_/g'`
394else
395   set dim=`echo $dim | sed -n -e 's/[^0-9]/ /gp'`
396   set dim_=`echo $dim | sed -n -e 's/[^0-9]/_/gp'`
397endif
398set nomlib=${nomlib}_${dim_}_t${ntrac}_$grille
399## M-A-F nomlib trop long sur CRAY pour ar
400if ( $CRAY ) then
401    set nomlib=F90_${dim_}_t${ntrac}
402endif
403if ( $NEC ) then
404    set nomlib=F90_${dim_}_t${ntrac}
405endif
406echo calcul de la dimension
407set dimc=`echo $dim | wc -w`
408
409if ( "$dimc" == "2" ) then
410set include="$include "'-I$(LIBF)/dyn2d '
411set dimh=$dim
412else
413set include="$include "'-I$(LIBF)/dyn3d '
414set dimh=`echo $dim | awk ' { print $1 "." $2 } '`
415endif
416echo $dimc
417
418########################################################################
419# path pour les #include
420########################################################################
421
422set include="$include -I$NCDFINC -I$IOIPSLDIR"
423echo $include
424
425########################################################################
426# Gestion des dimensions du modele.
427# on cree ou remplace le fichier des dimensions/nombre de traceur
428########################################################################
429
430cd $libf/grid
431if ( -f dimensions.h ) then
432echo 'ATTENTION: vous etes sans doute en train de compiler le modele par ailleurs'
433echo "Attendez que la premiere compilation soit terminee pour relancer la suivante."
434echo "Si vous etes sur que vous ne compilez pas le modele par ailleurs,"
435echo  vous pouvez continuer en repondant oui.
436echo "Voulez-vous vraiment continuer?"
437if ( $< == "oui" ) then
438\rm $libf/grid/dimensions.h
439else
440exit
441endif
442endif
443
444cd dimension
445makdim $ntrac $dim
446cat $libf/grid/dimensions.h
447
448cd $LMDGCM
449set libo=$libo/$nomlib
450if ( ! -d $libo )  then
451   mkdir $libo
452   cd $model
453endif
454
455########################################################################
456# Differentes dynamiques (3d, 2d, 1d)
457########################################################################
458
459set dimension=`echo $dim | wc -w`
460echo dimension $dimension
461if ( $dimension == 1 ) then
462echo pas de dynamique
463set dyn="L_DYN= DYN= L_FILTRE= DIRMAIN=phy$physique "
464endif
465endif
466cd $model
467if ( $dimension == 3 ) then
468cd libf/grid
469\rm fxyprim.h
470cp -p fxy_${grille}.h fxyprim.h
471endif
472
473######################################################################
474#   Traitement special pour le nouveau rayonnement de Laurent Li.
475######################################################################
476
477if ( -f $libf/phy$physique/raddim.h ) then
478if ( -f $libf/phy$physique/raddim.$dimh.h ) then
479\rm $libf/phy$physique/raddim.h
480cp -p $libf/phy$physique/raddim.$dimh.h $libf/phy$physique/raddim.h
481echo $libf/phy$physique/raddim.$dimh.h
482cat $libf/phy$physique/raddim.$dimh.h
483cat $libf/phy$physique/raddim.h
484else
485echo On peut diminuer la taille de l executable en creant
486echo le fichier $libf/phy$physique/raddim.$dimh.h
487\cp -p $libf/phy$physique/raddim.defaut.h $libf/phy$physique/raddim.h
488endif
489endif
490
491######################################################################
492# Gestion du filtre qui n'existe qu'en 3d.
493######################################################################
494
495if ( `expr $dimc \> 2` == 1 ) then
496   set filtre="FILTRE=$filtre"
497else
498   set filtre="FILTRE= L_FILTRE= "
499endif
500echo MACRO FILTRE $filtre
501
502echo $dimc
503
504########################################################################
505#  Avant de lancer le make, on recree le makefile si necessaire
506########################################################################
507# c'est a dire dans 3 cas:
508# 1. si la liste des fichiers .F et .h a ete modifiee depuis la
509#    derniere creation du makefile
510# 2. si le fichier contenant cette liste "liste_des_sources"
511#    n'existe pas.
512# 3. Si le makefile n'existe pas.
513########################################################################
514
515cd $model
516find libf -name '*.[Fh]' -print >! tmp77
517find libf -name '*.[Fh]' -exec egrep -i " *use *ioipsl" {} \; -print >! tmp90
518
519if (    `diff tmp77 liste_des_sources_f77 | wc -w` \
520     || `diff tmp90 liste_des_sources_f90 | wc -w` \
521     || ! -f makefile \
522     || ! -f liste_des_sources_f90 \
523     || ! -f liste_des_sources_f77 ) then
524        echo les fichiers suivants ont ete crees ou detruits
525        echo ou les fichiers suivants sont passes ou ne sont plus en Fortran 90
526        diff liste_des_sources_f77 tmp77
527        diff liste_des_sources_f90 tmp90
528        \cp tmp77 liste_des_sources_f77
529        \cp tmp90 liste_des_sources_f90
530        echo On recree le makefile
531        ./create_make_gcm >! tmp
532        \mv tmp makefile
533        echo Nouveau makefile cree.
534endif
535
536########################################################################
537#  Execution de la comande make
538########################################################################
539
540echo PHYSIQUE $phys
541echo dynamique $dyn $dimension
542echo OPTIM="$optim" $filtre LIBO=$libo $dyn PHYS=$phys DIM=$dimc PROG=$code
543echo PATH pour les fichiers INCLUDE $include
544echo OPLINK="$oplink"
545
546if $HP then
547   set f77='fort77 +OP'
548   set f90='jensaisrien'
549   set opt_link="$opt_link -lm"
550else  if $VPP then
551   set f77=frt
552   set f90=$f77
553else if $CRAY then
554   set f77=f90
555   set f90=f90
556else if $LINUX then
557   set f77=pgf90
558   set f90=pgf90
559else if $SUN then
560   set f77=f90
561   set f90=f90
562else if $NEC then
563   set f77=f90
564   set f90=f90
565else
566   set f77=f77
567   set f90=f90
568endif
569
570cd $model
571
572if $VPP then
573set make="gmake RANLIB=ls"
574else if $CRAY then
575set make="make RANLIB=ls"
576else if $NEC then
577set make="make RANLIB=ls"
578else if $LINUX then
579set make="make -k RANLIB=ranlib"
580else
581set make="make RANLIB=ranlib"
582endif
583
584
585
586#
587# les deux test suivants sont "temporaires" pour pallier des "faiblesses" du
588# compilateur fortran Sun: f90: SC4.0 11 Sep 1995 FORTRAN 90 1.1
589#
590#if ($code == 'create_limit' && $SUN) then
591#   set link=f77
592#   set opt_link="-L$NCDFLIB -lnetcdf"
593#endif
594
595#if ($code == 'create_etat0' && $SUN) then
596#   if ( ! -f $libo/libdyn3d.a ) then
597#     echo "Priere de compiler gcm en premier pour des raisons d'optimisation"
598#     \rm $libf/grid/dimensions.h
599#     exit
600#   endif
601#   set optim=" -dalign "
602#   set optim90=" -dalign -fixed "
603#   set opt_link="-L$IOIPSLDIR -lioipsl  -L$NCDFLIB -lnetcdf"
604#   set link="$f90 $optim90"
605#   touch $LMDGCM/libf/dyn3d/startvar.F
606#   touch $LMDGCM/libf/dyn3d/etat0_netcdf.F
607#endif
608
609#
610# Encore un test temporaire: probleme de compilation sur VPP
611# l'optimisation de startvar se passe mal
612#
613if ($code == 'create_etat0' && $VPP) then
614   if ( ! -f $libo/libdyn3d.a ) then
615     echo "Priere de compiler gcm en premier pour des raisons d'optimisation"
616     \rm $libf/grid/dimensions.h                                             
617     exit                       
618   endif
619   set optim=" -Wv,-Of,-ilfunc"
620   set optimbis=" -Psia -Aa -Wv,-m3 -Wp,-DVPP -Z $LMDGCM/listage"
621   set optim90="$optim""$optimbis"" -X9 -w"
622   set opt_link="-L$IOIPSLDIR -lioipsl -L$NCDFLIB -lnetcdf"
623   touch $LMDGCM/libf/dyn3d/startvar.F
624   touch $LMDGCM/libf/dyn3d/etat0_netcdf.F
625endif
626
627#################################################################
628# Execution de la comande make... ENFIN!
629#################################################################
630
631if $VPP then
632  set optim90=" $optim90 -Am -M$libo"
633 \cp $IOIPSLDIR/*.mod $libo
634else if $SUN then
635 set optim90=" $optim90 -M$IOIPSLDIR -M$libo "
636 set optim="$optim90"
637 \cp $IOIPSLDIR/*.mod $libo
638else if $NEC then
639 set optim90=" $optim90 -I$libo "
640else if $LINUX then
641 set optim90=" -fast -module $libo "
642 set mod_loc_dir=$libo
643 \cp $IOIPSLDIR/*.mod $libo
644endif
645
646set link="$f90 $optim90"
647
648#if $NEC then
649#  set link="sxld $opt_link"
650#  set ar=sxar
651#endif
652
653
654cd $localdir
655
656
657echo $make -f $LMDGCM/makefile \
658OPTION_DEP="$opt_dep" OPTION_LINK="$opt_link" \
659OPTIM90="$optim90" \
660OPTIM="$optim$optimbis" \
661INCLUDE="$include" \
662$filtre \
663LIBO=$libo \
664$dyn \
665$phys \
666DIM=$dimc \
667L_ADJNT="$adjnt" \
668LOCAL_DIR="$localdir"  \
669F77="$f77" \
670F90="$f90" \
671OPLINK="$oplink" \
672LINK="$link" \
673GCM="$LMDGCM" \
674MOD_LOC_DIR=$mod_loc_dir \
675MOD_SUFFIX=$mod_suffix \
676PROG=$code
677
678$make -f $LMDGCM/makefile \
679OPTION_DEP="$opt_dep" OPTION_LINK="$opt_link" \
680OPTIM90="$optim90" \
681OPTIM="$optim$optimbis" \
682INCLUDE="$include" \
683$filtre \
684LIBO=$libo \
685$dyn \
686$phys \
687DIM=$dimc \
688L_ADJNT="$adjnt" \
689LOCAL_DIR="$localdir"  \
690F77="$f77" \
691F90="$f90" \
692OPLINK="$oplink" \
693LINK="$link" \
694GCM="$LMDGCM" \
695MOD_LOC_DIR=$mod_loc_dir \
696MOD_SUFFIX=$mod_suffix \
697PROG=$code
698
699\rm $libf/grid/dimensions.h
Note: See TracBrowser for help on using the repository browser.