Work : fonctions avec arguments

This commit is contained in:
Yann Damour 2020-05-06 22:34:25 +02:00
parent 14fc81a642
commit bd46ce9f7d

View File

@ -1553,7 +1553,7 @@
"metadata": {},
"source": [
"## Réécriture pour itérerer ER\n",
"-> Il fonctionne apparemment mais je suis sceptique pour certains résultats, il faut réécrire toutes les fonctions en fonction de leur arguments pour le refaire mieux et éviter les problèmes rencontrés sur les variables loc"
"-> Il fonctionne apparemment mais je suis sceptique pour certains résultats, il faut réécrire toutes les fonctions en fonction de leur arguments pour le refaire mieux et éviter les problèmes rencontrés sur les variables locales et globales"
]
},
{
@ -1562,6 +1562,8 @@
"metadata": {},
"outputs": [],
"source": [
"(*\n",
"\n",
"(* Fonction pour itérer , cc critère de convergence*) \n",
"(* Localisation de Edminstion *)\n",
"let ee_ints = AOBasis.ee_ints ao_basis;;\n",
@ -1754,19 +1756,281 @@
" else\n",
" new_Phi {coef; loc;} (n-1)\n",
"\n",
" \n"
" \n",
"*)\n",
"\n",
"(*\n",
"new_Phi {coef = m_C ;loc = 0. } 0;;\n",
"*)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Réécriture des fonctions avec leurs arguments \n",
"-> pour refaire mieux la boucle en évitant des problèmes"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"new_Phi {coef = m_C ;loc = 0. } 1;;\n",
"\n"
"(* Localisation de Edminstion *)\n",
"\n",
"(* Définitions de base nécessaire pour la suite *)\n",
"let ee_ints = AOBasis.ee_ints ao_basis;;\n",
"let m_C = MOBasis.mo_coef mo_basis;;\n",
"let n_ao = Mat.dim1 m_C ;;\n",
"let n_mo = Mat.dim2 m_C ;;\n",
"let sum a = \n",
" Array.fold_left (fun accu x -> accu +. x) 0. a\n",
" \n",
"(******************************************************************************************************)\n",
"\n",
"(*Fonction général de calcul des intégrales*) \n",
"let integral_general g i j =\n",
"Array.map (fun a ->\n",
" let v = \n",
" Array.map (fun b ->\n",
" let u = \n",
" Array.map (fun e ->\n",
" let t = Array.map (fun f ->\n",
" (g a b e f i j) *. ERI.get_phys ee_ints a e b f\n",
" ) (Util.array_range 1 n_ao)\n",
" in sum t\n",
" ) (Util.array_range 1 n_ao)\n",
" in sum u\n",
" ) (Util.array_range 1 n_ao)\n",
" in sum v\n",
") (Util.array_range 1 n_ao)\n",
"|> sum \n",
";;\n",
"\n",
"(******************************************************************************************************)\n",
"\n",
"(* Fonction de calcul de tous les alpha -> Matrice, dépend de m_a12, m_b12 qui dépendent de m_C *)\n",
"let f_alpha m_C =\n",
"\n",
"(* Fonction de calcul de toutes les intégrales B_12 -> Matrice, dépend de m_C *)\n",
"let m_b12 = Mat.init_cols n_ao n_ao (fun i j -> \n",
"integral_general (fun a b e f i j ->\n",
" ( m_C.{a,i} *. m_C.{b,i} -. m_C.{a,j} *. m_C.{b,j} ) *. m_C.{e,i} *. m_C.{f,j}\n",
" ) i j\n",
" )\n",
"\n",
"in\n",
"(* Fonction de calcul de toutes les intégrales A_12 -> Matrice, dépend de m_C *)\n",
"let m_a12 = Mat.init_cols n_mo n_mo (fun i j ->\n",
"integral_general (fun a b e f i j -> m_C.{a,i} *. m_C.{b,j} *. m_C.{e,i} *. m_C.{f,j} \n",
" -. 0.25 *. ( m_C.{e,i} *. m_C.{f,i} -. m_C.{e,j} *. m_C.{f,j} ) \n",
" *. ( m_C.{a,i} *. m_C.{b,i} -. m_C.{a,j} *. m_C.{b,j} )\n",
" ) i j\n",
" )\n",
"in\n",
" Mat.init_cols n_mo n_mo ( fun i j ->\n",
" asin(m_b12.{i,j} /. sqrt((m_a12.{i,j}**2.) +. (m_b12.{i,j}**2.))))\n",
"\n",
"\n",
";;\n",
"f_alpha m_C;;\n",
"\n",
"\n",
"(******************************************************************************************************)\n",
" \n",
"(* Fonction d'extraction de la valeur maximum de alpha, avec alpha < pi/2 et extraction des indices de celle-ci *)\n",
"\n",
"(*Fonction d'extraction du plus grand élément d'une matrice*)\n",
"(*\n",
"let element_max m = \n",
"\n",
"Mat.as_vec m\n",
"|> iamax;;\n",
"\n",
"let m_alpha = f_alpha m_C ;;\n",
"\n",
"element_max m_alpha;;\n",
"\n",
"\n",
"let max_element f_alpha m_C = \n",
" let m_alpha = f_alpha m_C\n",
" in \n",
" Mat.as_vec m_alpha\n",
" |> iamax;;\n",
"\n",
"max_element f_alpha m_C;;\n",
"\n",
"(************************)\n",
"\n",
"let numero = element_max m_alpha;;\n",
"(*\n",
"let indice_i numero m n_lignes n_colonnes = \n",
" (numero - 1) mod n_lignes + 1;;\n",
" \n",
"indice_i numero m_alpha 10 10;; *)\n",
"\n",
"let indice_i f_alpha m_C max_element n_lignes = \n",
" let max = max_element f_alpha m_C\n",
" in\n",
" (max - 1) mod n_lignes +1 ;;\n",
"\n",
"indice_i f_alpha m_C max_element n_ao;;\n",
"\n",
"let indice_j f_alpha m_C max_element n_colonnes = \n",
" let max = max_element f_alpha m_C\n",
" in\n",
" (max - 1) / n_colonnes +1 ;;\n",
" \n",
"indice_j f_alpha m_C max_element n_ao;;\n",
"\n",
"*)\n",
"(*\n",
"\n",
"let max_element f_alpha m_C = \n",
" let m_alpha = f_alpha m_C\n",
" in \n",
" Mat.as_vec m_alpha\n",
" |> iamax;;\n",
"\n",
"max_element f_alpha m_C;;\n",
"\n",
"let indice_i f_alpha m_C max_element n_lignes = \n",
" let max = max_element f_alpha m_C\n",
" in\n",
" (max - 1) mod n_lignes +1 ;;\n",
"\n",
"indice_i f_alpha m_C max_element n_ao;;\n",
"\n",
"let indice_j f_alpha m_C max_element n_colonnes = \n",
" let max = max_element f_alpha m_C\n",
" in\n",
" (max - 1) / n_colonnes +1 ;;\n",
" \n",
"indice_j f_alpha m_C max_element n_ao;;\n",
"\n",
"(********************************)\n",
"\n",
"(* Elément max de la matrice f_alpha pour la matrice des coefficient m_C *)\n",
"let max_element2 m_C = \n",
" let m_alpha = f_alpha m_C\n",
" in \n",
" Mat.as_vec m_alpha\n",
" |> iamax;;\n",
"\n",
"max_element2 m_C;;\n",
"\n",
"(* Indice i de l'élément max *)\n",
"let indice_ii m_C n_lignes = \n",
" let max = max_element2 m_C\n",
" in\n",
" (max - 1) mod n_lignes +1 ;;\n",
"\n",
"indice_i f_alpha m_C max_element n_ao;;\n",
"\n",
"(* Indice j de l'élément max *)\n",
"let indice_jj m_C n_colonnes = \n",
" let max = max_element2 m_C\n",
" in\n",
" (max - 1) / n_colonnes +1 ;;\n",
" \n",
"indice_jj m_C n_ao;;\n",
"\n",
"(* Valeur max de alpha *)\n",
"let alpha m_C = \n",
" let m_alpha = f_alpha m_C \n",
" in\n",
" let i = indice_ii m_C n_ao\n",
" in\n",
" let j = indice_jj m_C n_ao\n",
" in\n",
" m_alpha.{i,j};;\n",
"\n",
"alpha m_C;;\n",
"\n",
"*)\n",
"(***********************************************)\n",
"\n",
"(* Si alpha max > pi/2 on doit soustraire pi/2 à la matrice des alphas *)\n",
"let m_alpha = f_alpha m_C;;\n",
"let rec new_m_alpha m_alpha n_rec_alpha=\n",
" let alpha_m =\n",
" Printf.printf \"%i\\n%!\" n_rec_alpha;\n",
" if n_rec_alpha == 0 \n",
" then m_alpha \n",
" else Mat.init_cols n_ao n_ao (fun i j -> \n",
" if (m_alpha.{i,j}) > 3.14 /. 2. \n",
" then (m_alpha.{i,j} -. ( 3.14 /. 2.))\n",
" else if m_alpha.{i,j} < -. 3.14 /. 2.\n",
" then (m_alpha.{i,j} +. ( 3.14 /. 2.))\n",
" else if m_alpha.{i,j} < 0. \n",
" then -. m_alpha.{i,j}\n",
" else m_alpha.{i,j} )\n",
" \n",
" in \n",
" Util.debug_matrix \"alpha_m\" alpha_m;\n",
" let max_element3 alpha_m = \n",
" Mat.as_vec alpha_m\n",
" |> iamax\n",
" in\n",
" let indice_ii = \n",
" let max = max_element3 alpha_m\n",
" in\n",
" Printf.printf \"%i\\n%!\" max;\n",
" (max - 1) mod n_ao +1 \n",
" in\n",
" let indice_jj = \n",
" let max = max_element3 alpha_m\n",
" in\n",
" (max - 1) / n_ao +1\n",
" in\n",
" let alpha alpha_m = \n",
" let i = indice_ii \n",
" in\n",
" let j = indice_jj \n",
" in\n",
" alpha_m.{i,j}\n",
" in\n",
" let alpha_max = alpha alpha_m \n",
" in\n",
" Printf.printf \"%f\\n%!\" alpha_max;\n",
" if alpha_max < 3.14 /. 2.\n",
" then alpha_max\n",
" else new_m_alpha alpha_m (n_rec_alpha-1);;\n",
" \n",
"\n",
"new_m_alpha m_alpha 10 ;;\n",
"\n",
"(******************************************************************************************)\n",
"\n",
"(* Matrice de rotation 2 par 2 *)\n",
"let m_R new_m_alpha =\n",
" let alpha = new_m_alpha m_alpha 10\n",
" in\n",
" Mat.init_cols 2 2 (fun i j -> if i=j then cos alpha\n",
" else if i>j then sin alpha \n",
" else -. sin alpha );;\n",
"\n",
"m_R new_m_alpha;;\n",
"\n",
"(******************************************************************************************)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
@ -1847,11 +2111,7 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"jupyter": {
"outputs_hidden": true
}
},
"metadata": {},
"outputs": [],
"source": [
"\n",
@ -1901,11 +2161,7 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"jupyter": {
"outputs_hidden": true
}
},
"metadata": {},
"outputs": [],
"source": [
"let i =1;;\n",
@ -1929,11 +2185,7 @@
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"jupyter": {
"outputs_hidden": true
}
},
"metadata": {},
"outputs": [],
"source": [
"(*Matrice b12*)\n",