Closed phil-blain closed 4 years ago
also, on daley a 32x1 test segfaults on gx1, not sure why
32x1 on cesium -> forrtl: error (182): floating invalid - possible uninitialized real/complex variable
2x1 on cesium -> segfault (stack overflow); takes forever with -heap-arrays
, so I stopped it.
2x1 on ppp3 -> Success
16x1 on cesium -> Success
32x1 on cesium -> also forrtl: error (182): floating invalid - possible uninitialized real/complex variable
24x1 on cesium -> idem
16x1 on cesium -> idem
12x1 on cesium -> idem
10x1 on cesium -> idem
3x1 on cesium -> idem
8x1 -> Success
Je pense avoir trouvé l'erreur: https://github.com/phil-blain/CICE/blob/60d356d9eac9001dda284ae49b7f6db3df5fe2a1/cicecore/cicedynB/dynamics/ice_dyn_vp.F90#L842
étant donné que L2norm
est déclaré de taille max_blocks
, et n'est pas initialisée à zéro, si nblocks < max_blocks
on additionne du garbage à la fin du tableau, et comme on initialise les tableaux à NaN on prends la racine carrée de NaN ce qui donne le "floating invalid".
J'ai corrigé ça dans 8bf95d1
Ça passe avec (vérifié sur ppp3):
@JFLemieux73 si tu veux rester au courant pour les tests MPI.
Je vais relancer le test gx1 5 ans sur daley maintenant que le bogue est réglé.
Ok je vais etre plus present sur github. Q pour toi. C'est mieux de rouler sur banting ou daley (pour ne pas piler sur les pieds des ops)?
@JFLemieux73 cette semaine jai fait des tests sur gx1 pour 5 jours (sur daley) avec plusieurs décompositions MPI, mais c'est très lent sur gx1, même avec un max de 20 itérations. Je pense qu'il faudrait profiler le code pour déterminer si la lenteur est dans la communication MPI ou bien dans la façon dont le code est écrit ou les deux.. pas simple.
J'ai comparé les sorties entre les différentes décompositions et il semble avoir des différences surtout au ice edge, donc je me demande si il n'y a pas une erreur quelque part dans l'implémentation ou bien la communication avec les conditions frontières... as tu une référence pour ça au niveau numérique?
J'ai aussi lancé d'autres tests avec différentes décomposition sur la grille gx3, au moins ça roule plus vite je vais pouvoir avoir des résultats plus rapidement.
Plan: comparer 2x1 et 1x1:
Pstar = 0
(terme de rhéologie == 0)Comparaisons 1x1 vs 2x1 (gx3)
donc je vais investiguer le PGMRES...
C'est gx3? En réglant la question de l'initialisation avec des 0 peut-être que tu as réglé la question des différentes décompositions?
Oui c'est gx3. je vais essayer les différents préconditioneurs, et augmenter le nombre de pas de temps. J'espère qu'en effet ça va régler les différences entre les décompositions
As-tu le même nb d'itération de fgmres et pgmres pour les 2 décomp?
Ca peut être le moment de mettre P*=0...ca va te guider pour trouver le problème.
Oui c'est les mêmes nombres d'itérations.
Ok bonne idée, je vais mettre P*=0.
Je pense que c'est normal que ça ne donne pas la même réponse avec différentes décomposition avec PGMRES.
Si tu te souviens (on s'en était déjà parlé), le PGMRES fait pas mal la même chose que FGMRES mais évite certaines communications (pour l'efficacité, vu que c'est juste un préconditioneur).
Donc, à mon avis, si on met les mêmes tolérances (reltol_fgmres
et reltol_nonlin
) pour les différentes décompositions, ça devrait être au final très proche. Par contre ici on limite le nombre d'itérations plutôt que d'itérer jusqu'à une certaine tolérance, donc je pense que c'est normal qu'on arrive pas au même résultat...
On peut s'appeler lundi pour en discuter.
J'ai fait des tests 1x1 vs 2x1 avec reltol_nonlin = 1e-6, 1e-8, 1e-10
sur 1 pas de temps:
bit for bit.
Je vais ensuite faire un test sur une journée avec 1E-10, voir comment l'advection/ridging influencent le résultat.
Après une journée il y a quand même beaucoup de différences:
C'est la diff de h (épaisseur)? Oui c'est pas mal gros. Essaie de voir ce qui est fait à la fin du evp avant de faire advection-ridging. On a peut-être oublié un truc.
Non c'est uvel. OK. je check ça
Je me suis rappelé que le sorties sont en simple précision... en regardant le restart à la place, après 1 pas de temps même à 1E-10 il y a des différences (environ 1E-14, avec EVP c'est bit for bit 1x1 vs 2x1)... j'ai comparé le code mais je n'ai pas encore trouvé qqch qui ferait une différence... je continue de chercher.
1e-14 comme différence c'est quand même vraiment petit. Je serais surpris que ça donne des diff de 1e-02 après une journée. Tu pourrais regarder l'impact avec 1e-12 comme tolérance.
Quand tu fais un seul pas de temps tu fais aussi l'advection-ridging?
OK je vais faire des tests supplémentaires.
Oui, l'advection et le ridging sont à "on".
Je ferais aussi un test avec P*=0. Selon moi dans ce cas tu vas avoir exactement la meme reponse apres le solveur et ca va te permettre de tester le reste de la mecanique.
J'ai fait un pas de temps à 1E-12, avec P = 0 et P = la valeur par défaut.
Avec P* = 0 j'ai des différences des 1E-18. Avec la valeur par défaut j'ai des différences de 1E-15.
J'ai essayé de rouler une journée à 1E-12 (avec Pstar non modifié), mais ça prenait plus qu'une heure et le walltime sur ma station est 1 heure (en mode batch)... il s'est rendu à 10 heures. après 10 heures la différence était de 1E-9.
Je vais refaire le test 1 journée à 1E-10 pcq moi aussi je trouve ça suprenant que ça donne 1E-2 après 24 heures... peut-être que je m'étais trompé.
Si tu roules une journée mais que tu utilises la matrice identité comme precond est-ce que c'est bfb? Ca te dirait au moins que le reste de la mécanique est ok et que c'est seulement pgmres qui donne des différences.
En passant pour le 1e-12 ca se peut que tu ne puisses pas te rendre à ça car c'est trop près de la précision machine.
Tu verrais le l2norm oscillé dans ce cas autour d'une valeur très basse.
Je vais refaire des tests avec les autres precond.
une journée, precond=diag, reltol=1E-8 => différences autour de 1E-6 à la fin de la journée (pour uvel, vvel)
Je viens de partir un journée, précond=ident, reltol=1E-8, mais ça a pris 40 minutes faire un pas de temps en 2x1... il s'est rendu au maximum d'itérations nonlinéaires (5000)...
Le solveur semble avoir le comportement attendu selon les résultats ci-dessus. Je vais fermer cette issue. Au besoin j'en ouvrirai une autre si/quand je ferai plus de tests.
I did a 5-day test on gx3 with max 50 nonlinear iterations, 1x1 vs 2x1 vs 4x1. There are small differences (~1E-04) at a few points...