#!/bin/sh

if [ $# -ne 2 ] || [ "$1" = "-h" ] || [ "$1" = "-help" ] || [ "$2" = "-h" ] || [ "$2" = "-help" ]; then
    echo 
    echo "     usage: $0 prefixe_du_fichier_champs fichier_des_temps"
    echo 
    echo '"prefixe_du_fichier_champs"' est le prefixe du maillage et fichier champs
    echo
    echo '"fichier_des_temps"' est un fichier contenant les valeurs des pas de temps et la longueur des pas
    echo "                     habituellement le fichier DT creer en faisant une passe hydrique de resolution"
    echo ""
    exit 
fi

#prefixe des fichiers
PREFIX=$1

if [ ! -e $PREFIX.champs ]; then
    echo
    echo Je ne trouve pas de fichier champs de nom: $PREFIX.champs
    echo
    exit
fi

fichier_temps=$2
if [ ! -e $2 ]; then
    echo
    echo Je ne trouve pas de fichier des temps de nom: $fichier_temps
    echo
    exit
fi

#
# On demande mantenant le type d'interpolation sur M et U
#
INTERPOLM=`grep \"M\" $PREFIX.champs | grep -v "#" | grep scal | awk '{print $1}'`
MINITIALE=`grep \"M\" $PREFIX.champs | grep -v "#" | grep scal | awk '{print $3}'`
INTERPOLU=`grep \"U\" $PREFIX.champs | grep -v "#" | grep v3d | awk '{print $1}'`
INTERPOLSCALU=`grep U $PREFIX.champs | grep -v "#" | grep v3d | awk '{print $1}'| sed -e s/v3d/scal/`

#
#     TABLEAU DES VALEURS MODIFIABLE POUR LE SCRIPT ET POUR L'ADAPTATION
#

#Pour l'adaptation
Metrique3D=true
NbIterMax=1000
CritereArret=1.e-8

# on distingue ce qui se passe au premier pas de temps des autres pas
Err_Geo_init=0.0001
LongRef_init=0.1
LongMin_init=0.00005
LongMax_init=0.001
QualiteMin_init=0.01
TolErr_init=3
AngleMin_init=0.5
Sequence_init=9
RepSequence_init=0

Variable0_init='alias U0=M'
Variable1_init='scalaire "U1" f(U)=(sqrt(UX^2 + UZ^2))'
Err_D0_init=0.3
U0Adim_init=1
Err_D1_init=0.3
U1Adim_init=1e-5

#pour les pas de temps suivant
Err_Geo=0.0001
LongRef=0.1
LongMin=0.0001
LongMax=0.001
QualiteMin=0.01
TolErr=3
AngleMin=0.5
Sequence=9
RepSequence=3

Variable0='scalaire "U0" f(M,Mn)=((M+Mn)/2.)'
Variable1='scalaire "U1" f(U)=(sqrt(UX^2 + UZ^2))'
Err_D0=0.5
U0Adim=2
Err_D1=0.4
U1Adim=1e-5

Reinterpole0=`echo $INTERPOLM '"U0Reint" reinterpole(Mn)'`
Reinterpole1=`echo $INTERPOLU '"U1Reint" reinterpole(Un)'`

#nom de l'executable pour resourdre 1 pas de temps
EXEC=./ThermoHygroMecanik_Newton.opt

#nom de l'executable pour l'adaptation à chaque pas de temps
EXECADAPTATION=./adaptationTHM.opt


if [ ! -e $EXEC ] || [ ! -e $EXECADAPTATION ]; then
    echo
    echo Mauvaise definition des executables de calcul et adapatation
    echo calcul: $EXEC
    echo adaptation: $EXECADAPTATION
    echo Changer dans le script 
    echo
    exit
fi

# nombre d'étape pour l'adaptation (chaque étape comprend une resolution + une adapatation)
NombreEtapeSequenceAdaptation=1

#
# A partir d'ici les modifications exigent une bonne comprehension, l'avez-vous?
#

#
# Destruction des fichiers intermediaire (juste au cas ou)
#
rm -f ValeurDuTempsInitial.dat $PREFIX.champs_etape0 $PREFIX.champs_etape0_init $PREFIX.champs.org tmp0 $PREFIX.champs_adap_init $PREFIX.champs_adap

#
# On valide certaines données 
#
cat $PREFIX.champs | grep -qs 'scalaire PasDeTemps \|scalaire T_0 \|scalaire NbPasDeTemps '
if [ ! $? -eq 0 ]; then
    echo
    echo 'Le point de depart en temps DOIT etre defini par: "scalaire T_0 "'
    echo 'Le pas de temps DOIT etre defini par: "scalaire PasDeTemps "'
    echo 'Le nombre pas de temps DOIT etre defini par: "scalaire NbPasDeTemps "'
    echo
    exit
fi

#
# On capture la valeur du temps initial dans le fichier original
#
grep "scalaire T_0 0" $PREFIX.champs > ValeurDuTempsInitial.dat

#
# Création des fichiers champs nécessaires
#


cp $PREFIX.champs $PREFIX.champs.org
sed -e '/booleen TempsImpose/s/v/f/' $PREFIX.champs > tmp0
sed -e '/scalaire T_0/i\include "ValeurDuTempsInitial.dat"' -e '/scalaire T_0/d' tmp0 > $PREFIX.champs_etape0_init
sed -e '/scalaire PasDeTemps /i\include "ValeurDuPasDeTemps.dat"' -e '/scalaire PasDeTemps /d' $PREFIX.champs_etape0_init > tmp0
sed -e '/scalaire NbPasDeTemps/i\scalaire NbPasDeTemps 1' -e '/scalaire NbPasDeTemps/d' tmp0 > $PREFIX.champs_etape0_init
cp $PREFIX.champs_etape0_init $PREFIX.champs_etape0

sed -e '/'$INTERPOLM' "M"/i\'$INTERPOLM' "M" "Champ.Mn"' -e '/'$INTERPOLM' "M"/d'  $PREFIX.champs_etape0 > tmp0
sed -e '/'$INTERPOLM' "MP"/i\'$INTERPOLM' "MP" "Champ.Mn"' -e '/'$INTERPOLM' "MP"/d'  tmp0 >  $PREFIX.champs_etape0
sed -e '/'$INTERPOLU' "U"/i\'$INTERPOLU' "U" "Champ.Un"' -e '/'$INTERPOLU' "U"/d'  $PREFIX.champs_etape0 > tmp0
sed -e '/'$INTERPOLM' "MP"/i\'$INTERPOLM' "MInitiale" '$MINITIALE'' tmp0 >  $PREFIX.champs_etape0

#
# Création des fichiers champs pour l'adapatation
#

echo scalaire Err_Geo  $Err_Geo_init > $PREFIX.champs_adap_init
echo scalaire LongRef $LongRef_init >> $PREFIX.champs_adap_init
echo scalaire LongMin $LongMin_init >> $PREFIX.champs_adap_init
echo scalaire LongMax $LongMax_init >> $PREFIX.champs_adap_init
echo scalaire QualiteMin $QualiteMin_init >> $PREFIX.champs_adap_init
echo scalaire TolErr $TolErr_init >> $PREFIX.champs_adap_init
echo scalaire AngleMin $AngleMin_init >> $PREFIX.champs_adap_init
echo scalaire Sequence $Sequence_init >> $PREFIX.champs_adap_init
echo scalaire RepSequence $RepSequence_init >> $PREFIX.champs_adap_init
echo booleen Metrique3D $Metrique3D >> $PREFIX.champs_adap_init
echo scalaire NbIterMax $NbIterMax >> $PREFIX.champs_adap_init
echo scalaire CritereArret $CritereArret >> $PREFIX.champs_adap_init

echo $INTERPOLM '"M" "'$PREFIX\_hyd1.M.champ$INTERPOLM'"' >> $PREFIX.champs_adap_init
echo $INTERPOLU '"U" "'$PREFIX\_hyd1.U.champ$INTERPOLU'"'  >> $PREFIX.champs_adap_init

echo $Variable0_init  >> $PREFIX.champs_adap_init
echo $Variable1_init  >> $PREFIX.champs_adap_init
echo scalaire Err_D0 $Err_D0_init  >> $PREFIX.champs_adap_init
echo scalaire U0Adim $U0Adim_init  >> $PREFIX.champs_adap_init
echo scalaire Err_D1 $Err_D1_init  >> $PREFIX.champs_adap_init
echo scalaire U1Adim $U1Adim_init  >> $PREFIX.champs_adap_init

echo scalaire Err_Geo  $Err_Geo > $PREFIX.champs_adap
echo scalaire LongRef $LongRef >> $PREFIX.champs_adap
echo scalaire LongMin $LongMin >> $PREFIX.champs_adap
echo scalaire LongMax $LongMax >> $PREFIX.champs_adap
echo scalaire QualiteMin $QualiteMin >> $PREFIX.champs_adap
echo scalaire TolErr $TolErr >> $PREFIX.champs_adap
echo scalaire AngleMin $AngleMin >> $PREFIX.champs_adap
echo scalaire Sequence $Sequence >> $PREFIX.champs_adap
echo scalaire RepSequence $RepSequence >> $PREFIX.champs_adap
echo booleen Metrique3D $Metrique3D >> $PREFIX.champs_adap
echo scalaire NbIterMax $NbIterMax >> $PREFIX.champs_adap
echo scalaire CritereArret $CritereArret >> $PREFIX.champs

echo $INTERPOLM '"M" "'$PREFIX\_hyd1.M.champ$INTERPOLM'"' >> $PREFIX.champs_adap
echo $INTERPOLM '"Mn" "Champ.Mn"' >> $PREFIX.champs_adap
echo $INTERPOLU '"U" "'$PREFIX\_hyd1.U.champ$INTERPOLU'"'  >> $PREFIX.champs_adap
echo $INTERPOLU '"Un" "Champ.Un"'  >> $PREFIX.champs_adap

echo $Variable0  >> $PREFIX.champs_adap
echo $Variable1  >> $PREFIX.champs_adap
echo scalaire Err_D0 $Err_D0  >> $PREFIX.champs_adap
echo scalaire U0Adim $U0Adim  >> $PREFIX.champs_adap
echo scalaire Err_D1 $Err_D1  >> $PREFIX.champs_adap
echo scalaire U1Adim $U1Adim  >> $PREFIX.champs_adap

echo $Reinterpole0 >> $PREFIX.champs_adap
echo $Reinterpole1 >> $PREFIX.champs_adap

#a priori tout va bien
NumeroDuPasDeTemps=1

#On conserve une copie du maillage original
cp $PREFIX.mail $PREFIX.mail.org

#boucle sur les pas de temps
cat $fichier_temps| while read LigneDansLeFichierDT 
    do
    NumeroEtapeDansLaSequenceAdaptation=0
    rm -f ValeurDuPasDeTemps.dat
    echo -n "scalaire PasDeTemps " > ValeurDuPasDeTemps.dat
    echo $LigneDansLeFichierDT | awk '{print $2}' >> ValeurDuPasDeTemps.dat

    # boucle adaptation-resolution pour un pas de temps

    echo -n "debut de la sequence d'adaptation pas " $NumeroDuPasDeTemps" : " > info_adaptation_$NumeroDuPasDeTemps
    echo `date` >> info_adaptation_$NumeroDuPasDeTemps

    while [ $NumeroEtapeDansLaSequenceAdaptation -lt $NombreEtapeSequenceAdaptation ]
	do

	if [ $NumeroDuPasDeTemps -eq 1 ]; then
	    cp $PREFIX.champs_etape0_init $PREFIX.champs
	else 
            cp $PREFIX.champs_etape0  $PREFIX.champs
	fi

	echo "debut du calcul avec "$EXEC" pas de temps" $NumeroDuPasDeTemps "etape "$NumeroEtapeDansLaSequenceAdaptation

	#Resolution
        rm -f sortie
	$EXEC $PREFIX >& sortie
        cat sortie | grep -iqs 'divergence\|error\|erreur'
        if [ $? -eq 0 ]; then
          echo
          echo "erreur dans "$EXEC "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
          echo
          exit
        fi
	echo "fin du calcul avec "$EXEC" pas de temps" $NumeroDuPasDeTemps "etape "$NumeroEtapeDansLaSequenceAdaptation
	
	let "NumeroEtapeDansLaSequenceAdaptation+=1"
	
	if [ $NumeroDuPasDeTemps -eq 1 ]; then
	    cp $PREFIX.champs_adap_init $PREFIX.champs
	else
	    cp $PREFIX.champs_adap $PREFIX.champs
	fi
	
	
	#Adaptation

	echo "debut de l'adaptation avec " $EXECADAPTATION " pas de temps" $NumeroDuPasDeTemps "etape "$NumeroEtapeDansLaSequenceAdaptation
        rm -f sortie_adaptation
	$EXECADAPTATION  $PREFIX > sortie_adaptation
        cat sortie_adaptation | grep -iqs 'divergence\|error\|erreur\|pas fonctionne' 
        if [ $? -eq 0 ]; then
          echo
          echo "erreur dans "$EXECADAPTATION "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
          echo
          exit
        fi
	echo "fin de l'adaptation avec" $EXECADAPTATION"pas de temps" $NumeroDuPasDeTemps "etape "$NumeroEtapeDansLaSequenceAdaptation

	cp mailAdapteMetrique.mail $PREFIX.mail
	cp $PREFIX.mail mailAdapteMetrique.mail.$NumeroDuPasDeTemps
	
	if [ $NumeroDuPasDeTemps -ne 1 ]; then
	    cp $PREFIX.U0Reint.champ$INTERPOLM Champ.Mn
	    cp $PREFIX.U1Reint.champ$INTERPOLU Champ.Un
	fi
    
    done 

    echo -n "fin de la sequence d'adaptation pas " $NumeroDuPasDeTemps" : " >>info_adaptation_$NumeroDuPasDeTemps
    echo `date` >> info_adaptation_$NumeroDuPasDeTemps

    #derniere resolution pour un pas de temps apres la derniere adaptation
    if [ $NumeroDuPasDeTemps -eq 1 ]; then
        cp $PREFIX.champs_etape0_init $PREFIX.champs
    else
      cp $PREFIX.champs_etape0    $PREFIX.champs
    fi


    echo "Calcul de la solution sur le maillage adapte au pas " $NumeroDuPasDeTemps 
    rm sortie
    $EXEC $PREFIX >& sortie
    cat sortie | grep -iqs  'divergence\|error\|erreur'
    if [ $? -eq 0 ]; then
      echo
      echo "erreur dans "$EXEC "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
      echo
      exit
    fi
    echo "pas de temps "$NumeroDuPasDeTemps "complete: "`date` >> info_adaptation_$NumeroDuPasDeTemps
    mkdir adaptation_pas_$NumeroDuPasDeTemps
    mv  mailAdapteMetrique.mail.$NumeroDuPasDeTemps adaptation_pas_$NumeroDuPasDeTemps/$PREFIX.mail
    mv info_adaptation_$NumeroDuPasDeTemps adaptation_pas_$NumeroDuPasDeTemps
    mv $PREFIX.U adaptation_pas_$NumeroDuPasDeTemps
    mv $PREFIX.M adaptation_pas_$NumeroDuPasDeTemps
    cp $PREFIX_hyd1*lin adaptation_pas_$NumeroDuPasDeTemps


    cp $PREFIX_hyd1.M.champ$INTERPOLM Champ.Mn
    cp $PREFIX_hyd1.U.champ$INTERPOLU Champ.Un

    let "NumeroDuPasDeTemps+=1"
    rm -f ValeurDuTempsInitial.dat
    echo -n "scalaire T_0 " > ValeurDuTempsInitial.dat
    echo $LigneDansLeFichierDT | awk '{print $1}' >> ValeurDuTempsInitial.dat
done
