Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do MPI tests #33

Closed
phil-blain opened this issue Jun 1, 2020 · 31 comments
Closed

Do MPI tests #33

phil-blain opened this issue Jun 1, 2020 · 31 comments
Milestone

Comments

@phil-blain
Copy link
Owner

No description provided.

@phil-blain phil-blain added this to the Picard solver milestone Jun 1, 2020
@phil-blain
Copy link
Owner Author

phil-blain commented Jun 8, 2020

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...

@phil-blain
Copy link
Owner Author

phil-blain commented Jun 9, 2020

also, on daley a 32x1 test segfaults on gx1, not sure why

@phil-blain
Copy link
Owner Author

phil-blain commented Jun 9, 2020

gx1

  • 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

gx3

  • 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

@phil-blain
Copy link
Owner Author

Je pense avoir trouvé l'erreur:

nlres_norm = sqrt(global_sum(sum(L2norm), distrb_info))

é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".

@phil-blain
Copy link
Owner Author

phil-blain commented Jun 12, 2020

J'ai corrigé ça dans 8bf95d1

Ça passe avec (vérifié sur ppp3):

gx3

  • 3x1
  • 10x1
  • 12x1
  • 16x1
  • 24x1
  • 32x1

gx1

  • 32x1

@phil-blain
Copy link
Owner Author

@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é.

@JFLemieux73
Copy link

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)?

@phil-blain
Copy link
Owner Author

@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.

@phil-blain
Copy link
Owner Author

Plan:
comparer 2x1 et 1x1:

  • 1 seul pas de temps
  • pas d'advection
  • changer le précond (d'abord ident, puis diag)
  • essayer Pstar = 0 (terme de rhéologie == 0)
  • comparer 2-norm au tout début avant FGMRES
  • vérifier que les vitesses ne dépasse jamais 2 m/s

@phil-blain
Copy link
Owner Author

phil-blain commented Jun 26, 2020

Comparaisons 1x1 vs 2x1 (gx3)

  • 1 pas de temps, precond=ident, kstrength=0 (Hibler), kridge = -1, ktransport = -1, 20 iters nonlin => bit-for-bit (b4b)
  • 1 pas de temps, precond=diag, kstrength=0 (Hibler), kridge = -1, ktransport = -1, 20 iters nonlin => bit-for-bit (b4b)
  • 1 pas de temps, precond=pgmres, kstrength=0 (Hibler), kridge = -1, ktransport = -1, 20 iters nonlin =>DIFFÉRENCES, environ [-1E-5, 1E-6]
  • 1 pas de temps, precond=pgmres, kstrength=0 (Hibler), kridge = -1, ktransport = -1, 20 iters nonlin, Pstar=0 => b4b

donc je vais investiguer le PGMRES...

@JFLemieux73
Copy link

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?

@phil-blain
Copy link
Owner Author

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

@JFLemieux73
Copy link

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.

@phil-blain
Copy link
Owner Author

Oui c'est les mêmes nombres d'itérations.

Ok bonne idée, je vais mettre P*=0.

@phil-blain
Copy link
Owner Author

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.

@phil-blain
Copy link
Owner Author

J'ai fait des tests 1x1 vs 2x1 avec reltol_nonlin = 1e-6, 1e-8, 1e-10 sur 1 pas de temps:

1e-6

Capture d’écran 2020-06-29 à 15 45 26

1e-8

1e-8

1e-10

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.

@phil-blain
Copy link
Owner Author

Après une journée il y a quand même beaucoup de différences:
Capture d’écran 2020-06-29 à 17 19 42

@JFLemieux73
Copy link

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.

@phil-blain
Copy link
Owner Author

Non c'est uvel. OK. je check ça

@phil-blain
Copy link
Owner Author

phil-blain commented Jun 30, 2020

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.

@JFLemieux73
Copy link

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?

@phil-blain
Copy link
Owner Author

OK je vais faire des tests supplémentaires.

Oui, l'advection et le ridging sont à "on".

@JFLemieux73
Copy link

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.

@phil-blain
Copy link
Owner Author

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é.

@JFLemieux73
Copy link

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.

@JFLemieux73
Copy link

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.

@JFLemieux73
Copy link

Tu verrais le l2norm oscillé dans ce cas autour d'une valeur très basse.

@phil-blain
Copy link
Owner Author

Je vais refaire des tests avec les autres precond.

@phil-blain
Copy link
Owner Author

une journée, precond=diag, reltol=1E-8 => différences autour de 1E-6 à la fin de la journée (pour uvel, vvel)

@phil-blain
Copy link
Owner Author

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)...

@phil-blain
Copy link
Owner Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants