cea-trust-platform / icoco-coupling

Interface for Code Coupling
8 stars 1 forks source link

Redéfinition iterateTimeStep / SteadyState #2

Open cyril-patricot opened 3 months ago

cyril-patricot commented 3 months ago

Proposition : dédier les méthodes iterate aux boucles itératives à plusieurs codes (sans avancer en temps).

Aujourd'hui iterateTimeStep() est optionnelle, et n'appelle qu'une itération de la méthode itérative interne du code. Peu de codes l'implémentent me semble-t-il.

En conséquence, on écrit généralement les boucles de couplage ainsi d'après ce que je vois :

while not converged:
  physics1.initTimeStep(dt)  
  physics2.initTimeStep(dt)
  ok1 = physics1.solveTimeStep()
  exchange1->2()
  ok2 = physics2.solveTimeStep()
  converged = ...
  if not converged:
    exchange2->1()
    physics1.abortTimeStep()
    physics2.abortTimeStep()
physics1.validateTimeStep()
physics2.validateTimeStep()

C'est un peu lourd. Historiquement (CORPUS), converged s'écrit :

converged = check_couplage and ok1 and ok2

-> On a toujours considéré que si CRONOS2 ou FLICA4 était en erreur, c'était qu'ils n'avaient pas fini de converger (on les forçait à faire un tout petit nombre d'itérations internes par appel). Mais cette interprétation de la sortie de solveTimeStep() n'est pas du tout standard.

D'où l'idée de rendre iterateTimeStep obligatoire, en enlevant l'obligation "une seule itération interne" (en fait on aura envie de piloter ses critères d'arrêt par ailleurs). Son retour "converged" (déjà existant) résout la question de l'utilisation de la sortie de solveTimeStep(). Le fait qu'il n'est (déjà) pas nécessaire de faire un abortTimeStep / initTimeStep() entre deux appels allège la boucle.

On arriverait à (il faudrait ajouter une gestion de l'erreur d'un des codes...) :

physics1.initTimeStep(dt)  
physics2.initTimeStep(dt)
while not converged:
  ok1, converged1 = physics1.iterateTimeStep()
  exchange1->2()
  ok2, converged2 = physics2.iterateTimeStep()
  exchange2->1()
  converged = check_couplage and converged1 and converged2
physics1.validateTimeStep()
physics2.validateTimeStep()
cpatricot commented 1 month ago

L'idée est pour l'instant validée.