---
stages:
  - prepareAll
  - preprocessing
  - postprocessing
  - compileSpectralIntel
  - compileSpectralGNU
  - prepareSpectral
  - spectral
  - compileMarc2017
  - marc
  - compileAbaqus2016
  - compileAbaqus2017
  - example
  - performance
  - createDocumentation
  - saveDocumentation
  - updateMaster
  - clean
  - releaseLock

###################################################################################################
before_script:
  - if [ $(awk "/$CI_PIPELINE_ID/{print NR}" $TESTROOT/GitLabCI.queue)x == 'x' ];
      then echo $CI_PIPELINE_ID >> $TESTROOT/GitLabCI.queue;
    fi
  - while [ $(awk "/$CI_PIPELINE_ID/{print NR}" $TESTROOT/GitLabCI.queue) != 1 ];
      do sleep 5m;
    done
  - source $DAMASKROOT/env/DAMASK.sh
  - cd $DAMASKROOT/PRIVATE/testing

###################################################################################################
variables:
  # ===============================================================================================
  # GitLab Settings
  # ===============================================================================================
  GIT_SUBMODULE_STRATEGY: none

  # ===============================================================================================
  # Shortcut names
  # ===============================================================================================
  DAMASKROOT: "$TESTROOT/GitLabCI_Pipeline_$CI_PIPELINE_ID/DAMASK"

  # ===============================================================================================
  # Names of module files to load
  # ===============================================================================================
  # ++++++++++++ Compiler ++++++++++++++++++++++++++++++++++++++++++++++
  IntelCompiler16_0:               "Compiler/Intel/16.0 Libraries/IMKL/2016"
  IntelCompiler17_0:               "Compiler/Intel/17.0 Libraries/IMKL/2017"
  IntelCompiler18_1:               "Compiler/Intel/18.1 Libraries/IMKL/2018"
  GNUCompiler7_3:                  "Compiler/GNU/7.3"
  # ------------ Defaults ----------------------------------------------
  IntelCompiler:                   "$IntelCompiler18_1"
  GNUCompiler:                     "$GNUCompiler7_3"
  # ++++++++++++ MPI +++++++++++++++++++++++++++++++++++++++++++++++++++
  MPICH3_2Intel17_0:               "MPI/Intel/17.0/MPICH/3.2"
  MPICH3_2Intel18_1:               "MPI/Intel/18.1/MPICH/3.2.1"
  MPICH3_2GNU7_3:                  "MPI/GNU/7.3/MPICH/3.2.1"
  # ------------ Defaults ----------------------------------------------
  MPICH_GNU:                       "$MPICH3_2GNU7_3"
  MPICH_Intel:                     "$MPICH3_2Intel18_1"
  # ++++++++++++ PETSc +++++++++++++++++++++++++++++++++++++++++++++++++
  PETSc3_9_1MPICH3_2Intel18_1:     "Libraries/PETSc/3.9.1/Intel-18.1-MPICH-3.2.1"
  PETSc3_9_1MPICH3_2GNU7_3:        "Libraries/PETSc/3.9.1/GNU-7.3-MPICH-3.2.1"
  # ------------ Defaults ----------------------------------------------
  PETSc_MPICH_Intel:               "$PETSc3_9_1MPICH3_2Intel18_1"
  PETSc_MPICH_GNU:                 "$PETSc3_9_1MPICH3_2GNU7_3"
  # ++++++++++++ FEM +++++++++++++++++++++++++++++++++++++++++++++++++++
  Abaqus2016:                      "FEM/Abaqus/2016"
  Abaqus2017:                      "FEM/Abaqus/2017"
  MSC2017:                         "FEM/MSC/2017"
  # ------------ Defaults ----------------------------------------------
  Abaqus:                          "$Abaqus2017"
  MSC:                             "$MSC2017"
  # ++++++++++++ Documentation +++++++++++++++++++++++++++++++++++++++++
  Doxygen1_8_13:                   "Documentation/Doxygen/1.8.13"
  # ------------ Defaults ----------------------------------------------
  Doxygen:                         "$Doxygen1_8_13"


###################################################################################################
checkout:
  stage: prepareAll
  before_script:
    - echo $CI_PIPELINE_ID >> $TESTROOT/GitLabCI.queue
    - while [ $(awk "/$CI_PIPELINE_ID/{print NR}" $TESTROOT/GitLabCI.queue) != 1 ];
        do sleep 5m;
      done
  script:
    - mkdir -p $DAMASKROOT
    - cd $DAMASKROOT
    - if [ -d DAMASK ]; then rm -rf DAMASK; fi                                                      # there might be some leftovers from a failed clone
    - git clone -q git@magit1.mpie.de:damask/DAMASK.git .
    - git checkout $CI_COMMIT_SHA
    - git submodule update --init
    - source env/DAMASK.sh
    - make processing
  except:
    - master
    - release

###################################################################################################
OrientationRelationship:
  stage: preprocessing
  script: OrientationRelationship/test.py
  except:
    - master
    - release

Pre_SeedGeneration:
  stage: preprocessing
  script: PreProcessing_SeedGeneration/test.py
  except:
    - master
    - release

Pre_GeomGeneration:
  stage: preprocessing
  script: PreProcessing_GeomGeneration/test.py
  except:
    - master
    - release

Pre_GeomModification:
  stage: preprocessing
  script: PreProcessing_GeomModification/test.py
  except:
    - master
    - release

Pre_General:
  stage: preprocessing
  script: PreProcessing/test.py
  except:
    - master
    - release

Spectral_geometryPacking:
  stage: preprocessing
  script: Spectral_geometryPacking/test.py
  except:
    - master
    - release

###################################################################################################
Post_General:
  stage: postprocessing
  script: PostProcessing/test.py
  except:
    - master
    - release

Post_GeometryReconstruction:
  stage: postprocessing
  script: Spectral_geometryReconstruction/test.py
  except:
    - master
    - release

Post_addCurl:
  stage: postprocessing
  script: addCurl/test.py
  except:
    - master
    - release

Post_addDivergence:
  stage: postprocessing
  script: addDivergence/test.py
  except:
    - master
    - release

Post_addGradient:
  stage: postprocessing
  script: addGradient/test.py
  except:
    - master
    - release

Post_ParaviewRelated:
  stage: postprocessing
  script: ParaviewRelated/test.py
  except:
    - master
    - release

###################################################################################################
Compile_Intel:
  stage: compileSpectralIntel
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - SpectralAll_compile/test.py
  except:
    - master
    - release

###################################################################################################
Compile_GNU:
  stage: compileSpectralGNU
  script:
    - module load $GNUCompiler $MPICH_GNU $PETSc_MPICH_GNU
    - SpectralAll_compile/test.py
  except:
    - master
    - release

###################################################################################################
Compile_Intel_Prepare:
  stage: prepareSpectral
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - cd $DAMASKROOT
    - make clean spectral processing
  except:
    - master
    - release

###################################################################################################
Spectral_PackedGeometry:
  stage: spectral
  script: Spectral_PackedGeometry/test.py
  except:
    - master
    - release

Spectral_parsingArguments:
  stage: spectral
  script: Spectral_parsingArguments/test.py
  except:
    - master
    - release

StateIntegration_compareVariants:
  stage: spectral
  script: StateIntegration_compareVariants/test.py
  except:
    - master
    - release

nonlocal_densityConservation:
  stage: spectral
  script: nonlocal_densityConservation/test.py
  except:
    - master
    - release

Spectral_ipNeighborhood:
  stage: spectral
  script: Spectral_ipNeighborhood/test.py
  except:
    - master
    - release

Nonlocal_Damage_DetectChanges:
  stage: spectral
  script: Nonlocal_Damage_DetectChanges/test.py
  except:
    - master
    - release

SpectralAll_restart:
  stage: spectral
  script: SpectralAll_restart/test.py
  except:
    - master
    - release

SpectralAll_parsingLoadCase:
  stage: spectral
  script: SpectralAll_parsingLoadCase/test.py
  except:
    - master
    - release

SpectralBasic_loadCaseRotation:
  stage: spectral
  script: SpectralBasic_loadCaseRotation/test.py
  except:
    - master
    - release

Spectral_MPI:
  stage: spectral
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - Spectral_MPI/test.py
  except:
    - master
    - release

Plasticity_DetectChanges:
  stage: spectral
  script: Plasticity_DetectChanges/test.py
  except:
    - master
    - release

Homogenization:
  stage: spectral
  script: Homogenization/test.py
  except:
    - master
    - release

Phenopowerlaw_singleSlip:
  stage: spectral
  script: Phenopowerlaw_singleSlip/test.py
  except:
    - master
    - release

HybridIA:
  stage: spectral
  script: HybridIA/test.py
  except:
    - master
    - release

TextureComponents:
  stage: spectral
  script: TextureComponents/test.py
  except:
    - master
    - release


###################################################################################################
Marc_compileIfort2017:
  stage: compileMarc2017
  script:
    - module load $IntelCompiler17_0 $MSC2017
    - Marc_compileIfort/test.py -m 2017
  except:
    - master
    - release

###################################################################################################
Hex_elastic:
  stage: marc
  script:
    - module load $IntelCompiler17_0 $MSC
    - Hex_elastic/test.py
  except:
    - master
    - release

CubicFCC_elastic:
  stage: marc
  script:
    - module load $IntelCompiler17_0 $MSC
    - CubicFCC_elastic/test.py
  except:
    - master
    - release

CubicBCC_elastic:
  stage: marc
  script:
    - module load $IntelCompiler17_0 $MSC
    - CubicBCC_elastic/test.py
  except:
    - master
    - release

J2_plasticBehavior:
  stage: marc
  script:
    - module load $IntelCompiler17_0 $MSC
    - J2_plasticBehavior/test.py
  except:
    - master
    - release

###################################################################################################
Abaqus_compile2016:
  stage: compileAbaqus2016
  script:
    - module load $IntelCompiler16_0 $Abaqus2016
    - Abaqus_compileIfort/test.py -a 2016
  except:
    - master
    - release

###################################################################################################
Abaqus_compile2017:
  stage: compileAbaqus2017
  script:
    - module load $IntelCompiler16_0 $Abaqus2017
    - Abaqus_compileIfort/test.py -a 2017
  except:
    - master
    - release

###################################################################################################
SpectralExample:
  stage: example
  script: SpectralAll_example/test.py
  only:
    - development

AbaqusExample:
  stage: example
  script:
    - module load $IntelCompiler16_0 $Abaqus
    - Abaqus_example/test.py
  only:
    - development

###################################################################################################
SpectralRuntime:
  stage: performance
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel
    - cd $DAMASKROOT
    - make clean spectral processing OPTIMIZATION=AGGRESSIVE
    - cd $TESTROOT/performance                                                                      # location of old results
    - git checkout .                                                                                # undo any changes (i.e. run time data from non-development branch)
    - cd $DAMASKROOT/PRIVATE/testing
    - SpectralAll_runtime/test.py -d $TESTROOT/performance
  except:
    - master
    - release

###################################################################################################
AbaqusStd:
  stage: createDocumentation
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel $Doxygen
    - $DAMASKROOT/PRIVATE/documenting/runDoxygen.sh $DAMASKROOT abaqus
  except:
    - master
    - release

Marc:
  stage: createDocumentation
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel $Doxygen
    - $DAMASKROOT/PRIVATE/documenting/runDoxygen.sh $DAMASKROOT marc
  except:
    - master
    - release

Spectral:
  stage: createDocumentation
  script:
    - module load $IntelCompiler $MPICH_Intel $PETSc_MPICH_Intel $Doxygen
    - $DAMASKROOT/PRIVATE/documenting/runDoxygen.sh $DAMASKROOT spectral
  except:
    - master
    - release

##################################################################################################
backupData:
  stage: saveDocumentation
  script:
    - cd $TESTROOT/performance                                                                      # location of new runtime results
    - git commit -am"${CI_PIPELINE_ID}_${CI_COMMIT_SHA}"
    - mkdir $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}
    - cp $TESTROOT/performance/time.txt $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - mv $TESTROOT/performance/time.png $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - cp $TESTROOT/performance/memory.txt $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - mv $TESTROOT/performance/memory.png $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
    - mv $DAMASKROOT/PRIVATE/documenting/DAMASK_* $BACKUP/${CI_PIPELINE_ID}_${CI_COMMIT_SHA}/
  only:
    - development

##################################################################################################
mergeIntoMaster:
  stage: updateMaster
  script:
    - cd $DAMASKROOT
    - export TESTEDREV=$(git describe)                                                              # might be detached from development branch
    - echo $TESTEDREV > VERSION
    - git commit VERSION -m "[skip ci] updated version information after successful test of $TESTEDREV"
    - export UPDATEDREV=$(git describe)                                                             # tested state + 1 commit
    - git checkout master
    - git merge $UPDATEDREV -s recursive -X ours                                                    # conflicts occur only for inconsistent state
    - git push origin master                                                                        # master is now tested version and has updated VERSION file
    - git checkout development
    - git pull
    - git merge master -s recursive -X ours -m "[skip ci] Merge branch 'master' into development"   # only possible conflict is in VERSION file
    - git push origin development                                                                   # development is unchanged (as master is based on it) but has updated VERSION file
  only:
    - development

###################################################################################################
removeData:
  stage: clean
  before_script:
    - echo 'Do nothing'
  script:
    - rm -rf $TESTROOT/GitLabCI_Pipeline_$CI_PIPELINE_ID
    - sed -i "/$CI_PIPELINE_ID/d" $TESTROOT/GitLabCI.queue                                          # in case pipeline was manually (web GUI) restarted and releaseLock was performed already
  except:
    - master
    - release

###################################################################################################
removeLock:
  stage: releaseLock
  before_script:
    - echo 'Do nothing'
  when: always
  script: sed -i "/$CI_PIPELINE_ID/d" $TESTROOT/GitLabCI.queue
  except:
    - master
    - release