Skip to content

Commit

Permalink
Major NRPy+ update: Fix BaikalETK.
Browse files Browse the repository at this point in the history
  • Loading branch information
zachetienne committed Dec 28, 2022
1 parent 7128ee1 commit 07dd7c6
Showing 1 changed file with 122 additions and 78 deletions.
200 changes: 122 additions & 78 deletions Tutorial-ETK_thorn-BaikalETK.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -349,70 +349,70 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Generating symbolic expressions for BSSN constraints (Cartesian coords)...Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...\n",
"Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...Generating symbolic expressions for BSSN constraints (Cartesian coords)...\n",
"Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...\n",
"Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...Generating symbolic expressions for BSSN constraints (Cartesian coords)...\n",
"\n",
"Generating symbolic expressions for BSSN constraints (Cartesian coords)...Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...Generating symbolic expressions for BSSN constraints (Cartesian coords)...Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...Generating symbolic expressions for BSSN constraints (Cartesian coords)...Generating symbolic expressions for BSSN constraints (Cartesian coords)...\n",
"Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...\n",
"\n",
"Generating symbolic expressions for BSSN constraints (Cartesian coords)...Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...Generating symbolic expressions for BSSN constraints (Cartesian coords)...\n",
"Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...\n",
"Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...\n",
"Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...Generating symbolic expressions for 3-Ricci tensor (Cartesian coords)...\n",
"\n",
"\n",
"\n",
"Generating symbolic expressions for BSSN_RHSs (Cartesian coords)...\n",
"Generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords)...Generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords)...\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"Generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords)...\n",
"Generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords)...\n",
"Finished generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords) in 0.1 seconds.\n",
"Finished generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords) in 0.0 seconds.\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.3 seconds. Next up: C codegen...Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.3 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.3 seconds. Next up: C codegen...\n",
"Generating C code for 3-Ricci tensor (FD order=8) (Cartesian coords)...\n",
"Generating C code for 3-Ricci tensor (FD order=2) (Cartesian coords)...\n",
"Finished generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords) in 0.2 seconds.\n",
"Finished generating C code for Enforcing det(gammabar)=det(gammahat) constraint (Cartesian coords) in 0.2 seconds.\n",
"Generating symbolic expressions for BSSN constraints (Cartesian coords)...\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.7 seconds. Next up: C codegen...\n",
"Generating C code for 3-Ricci tensor (FD order=6) (Cartesian coords)...\n",
"\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 0.4 seconds. Next up: C codegen...\n",
"Generating C code for BSSN_RHSs (FD order=8) (Cartesian coords)...\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.4 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.8 seconds. Next up: C codegen...\n",
"Generating C code for 3-Ricci tensor (FD order=4) (Cartesian coords)...\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.5 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.8 seconds. Next up: C codegen...\n",
"Generating C code for 3-Ricci tensor (FD order=2) (Cartesian coords)...Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 0.8 seconds. Next up: C codegen...Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.8 seconds. Next up: C codegen...\n",
"Generating C code for 3-Ricci tensor (FD order=4) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 0.5 seconds. Next up: C codegen...\n",
"\n",
"\n",
"Generating C code for BSSN_RHSs (FD order=8) (Cartesian coords)...\n",
"Finished generating symbolic expressions for 3-Ricci tensor (Cartesian coords) in 0.9 seconds. Next up: C codegen...\n",
"Generating C code for 3-Ricci tensor (FD order=8) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 1.0 seconds. Next up: C codegen...\n",
"Generating C code for BSSN_RHSs (FD order=6) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 1.1 seconds. Next up: C codegen...\n",
"Generating C code for BSSN_RHSs (FD order=4) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 0.6 seconds. Next up: C codegen...\n",
"Generating C code for BSSN constraints (FD order=8) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 0.6 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 1.4 seconds. Next up: C codegen...\n",
"Generating C code for BSSN constraints (FD order=4) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 1.4 seconds. Next up: C codegen...\n",
"Generating C code for BSSN constraints (FD order=6) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 0.6 seconds. Next up: C codegen...\n",
"Generating C code for BSSN_RHSs (FD order=6) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 0.7 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 1.4 seconds. Next up: C codegen...\n",
"Generating C code for BSSN constraints (FD order=8) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 2.1 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 2.1 seconds. Next up: C codegen...Generating C code for BSSN_RHSs (FD order=4) (Cartesian coords)...\n",
"\n",
"Generating C code for BSSN constraints (FD order=4) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 0.8 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 2.3 seconds. Next up: C codegen...\n",
"Generating C code for BSSN_RHSs (FD order=2) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN_RHSs (Cartesian coords) in 0.8 seconds. Next up: C codegen...\n",
"Generating C code for BSSN_RHSs (FD order=4) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 1.0 seconds. Next up: C codegen...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 2.6 seconds. Next up: C codegen...\n",
"Generating C code for BSSN constraints (FD order=2) (Cartesian coords)...\n",
"Finished generating symbolic expressions for BSSN constraints (Cartesian coords) in 1.2 seconds. Next up: C codegen...\n",
"Generating C code for BSSN constraints (FD order=4) (Cartesian coords)...\n",
"Finished generating C code for BSSN constraints (FD order=4) (Cartesian coords) in 16.5 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=6) (Cartesian coords) in 17.0 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=2) (Cartesian coords) in 16.6 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=4) (Cartesian coords) in 16.9 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=8) (Cartesian coords) in 18.5 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=4) (Cartesian coords) in 37.9 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=6) (Cartesian coords) in 39.0 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=8) (Cartesian coords) in 41.5 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=2) (Cartesian coords) in 49.0 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=4) (Cartesian coords) in 49.8 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=2) (Cartesian coords) in 55.4 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=4) (Cartesian coords) in 55.6 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=6) (Cartesian coords) in 56.1 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=4) (Cartesian coords) in 56.1 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=8) (Cartesian coords) in 57.3 seconds.\n"
"Finished generating C code for BSSN constraints (FD order=4) (Cartesian coords) in 35.4 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=4) (Cartesian coords) in 35.6 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=6) (Cartesian coords) in 36.4 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=2) (Cartesian coords) in 35.3 seconds.\n",
"Finished generating C code for BSSN constraints (FD order=8) (Cartesian coords) in 38.1 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=4) (Cartesian coords) in 68.8 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=6) (Cartesian coords) in 80.9 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=8) (Cartesian coords) in 82.3 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=4) (Cartesian coords) in 84.3 seconds.\n",
"Finished generating C code for BSSN_RHSs (FD order=2) (Cartesian coords) in 84.3 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=4) (Cartesian coords) in 96.1 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=2) (Cartesian coords) in 99.3 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=6) (Cartesian coords) in 102.4 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=8) (Cartesian coords) in 102.8 seconds.\n",
"Finished generating C code for 3-Ricci tensor (FD order=4) (Cartesian coords) in 103.4 seconds.\n"
]
}
],
Expand Down Expand Up @@ -1485,9 +1485,53 @@
" name = \"ADM_to_BSSN_\" + ThornName\n",
" params = \"CCTK_ARGUMENTS\"\n",
"\n",
" import BSSN.ADM_Numerical_Spherical_or_Cartesian_to_BSSNCurvilinear as atob\n",
" IDhDD,IDaDD,IDtrK,IDvetU,IDbetU,IDalpha,IDcf,IDlambdaU = \\\n",
" atob.Convert_Spherical_or_Cartesian_ADM_to_BSSN_curvilinear(\"Cartesian\",\"DoNotOutputADMInputFunction\",os.path.join(ThornName,\"src\"))\n",
" # Set CoordSystem to Cartesian\n",
" par.set_parval_from_str(\"reference_metric::CoordSystem\", \"Cartesian\")\n",
" rfm.reference_metric()\n",
"\n",
" import sympy as sp\n",
" gammaSphorCartDD = ixp.declarerank2(\"gammaSphorCartDD\", \"sym01\")\n",
" KSphorCartDD = ixp.declarerank2(\"KSphorCartDD\", \"sym01\")\n",
" alphaSphorCart = sp.symbols(\"alphaSphorCart\")\n",
" betaSphorCartU = ixp.declarerank1(\"betaSphorCartU\")\n",
" BSphorCartU = ixp.declarerank1(\"BSphorCartU\")\n",
"\n",
" import BSSN.BSSN_in_terms_of_ADM as BitoA\n",
" BitoA.gammabarDD_hDD(gammaSphorCartDD)\n",
" BitoA.trK_AbarDD_aDD(gammaSphorCartDD, KSphorCartDD)\n",
" BitoA.cf_from_gammaDD(gammaSphorCartDD)\n",
" BitoA.betU_vetU(betaSphorCartU, BSphorCartU)\n",
" alpha = alphaSphorCart\n",
" hDD = BitoA.hDD\n",
" trK = BitoA.trK\n",
" aDD = BitoA.aDD\n",
" cf = BitoA.cf\n",
" vetU = BitoA.vetU\n",
" betU = BitoA.betU\n",
"\n",
" # Next compute lambda^i\n",
" import BSSN.BSSN_quantities as Bq\n",
" Bq.gammabar__inverse_and_derivs() # Provides gammabarUU and GammabarUDD\n",
" gammabarUU = Bq.gammabarUU\n",
" GammabarUDD = Bq.GammabarUDD\n",
"\n",
" # Next evaluate \\bar{\\Lambda}^i, based on GammabarUDD above and GammahatUDD\n",
" # (from the reference metric):\n",
" LambdabarU = ixp.zerorank1()\n",
" for i in range(3):\n",
" for j in range(3):\n",
" for k in range(3):\n",
" LambdabarU[i] += gammabarUU[j][k] * (GammabarUDD[i][j][k] - rfm.GammahatUDD[i][j][k])\n",
"\n",
" # Finally apply rescaling:\n",
" # lambda^i = Lambdabar^i/\\text{ReU[i]}\n",
" lambdaU = ixp.zerorank1()\n",
" for i in range(3):\n",
" lambdaU[i] = LambdabarU[i] / rfm.ReU[i]\n",
" \n",
"# import BSSN.ADM_Numerical_Spherical_or_Cartesian_to_BSSNCurvilinear as atob\n",
"# IDhDD,IDaDD,IDtrK,IDvetU,IDbetU,IDalpha,IDcf,IDlambdaU = \\\n",
"# atob.Convert_Spherical_or_Cartesian_ADM_to_BSSN_curvilinear(\"Cartesian\",\"DoNotOutputADMInputFunction\",os.path.join(ThornName,\"src\"))\n",
"\n",
" # Store the original list of registered gridfunctions; we'll want to unregister\n",
" # all the *SphorCart* gridfunctions after we're finished with them below.\n",
Expand Down Expand Up @@ -1536,27 +1580,27 @@
" par.set_parval_from_str(\"finite_difference::enable_FD_functions\", False)\n",
"\n",
" all_but_lambdaU_expressions = [\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD00\"), rhs=IDhDD[0][0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD01\"), rhs=IDhDD[0][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD02\"), rhs=IDhDD[0][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD11\"), rhs=IDhDD[1][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD12\"), rhs=IDhDD[1][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD22\"), rhs=IDhDD[2][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD00\"), rhs=IDaDD[0][0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD01\"), rhs=IDaDD[0][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD02\"), rhs=IDaDD[0][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD11\"), rhs=IDaDD[1][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD12\"), rhs=IDaDD[1][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD22\"), rhs=IDaDD[2][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"trK\"), rhs=IDtrK),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"vetU0\"), rhs=IDvetU[0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"vetU1\"), rhs=IDvetU[1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"vetU2\"), rhs=IDvetU[2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"betU0\"), rhs=IDbetU[0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"betU1\"), rhs=IDbetU[1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"betU2\"), rhs=IDbetU[2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"alpha\"), rhs=IDalpha),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"cf\"), rhs=IDcf)]\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD00\"), rhs=hDD[0][0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD01\"), rhs=hDD[0][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD02\"), rhs=hDD[0][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD11\"), rhs=hDD[1][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD12\"), rhs=hDD[1][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"hDD22\"), rhs=hDD[2][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD00\"), rhs=aDD[0][0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD01\"), rhs=aDD[0][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD02\"), rhs=aDD[0][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD11\"), rhs=aDD[1][1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD12\"), rhs=aDD[1][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"aDD22\"), rhs=aDD[2][2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"trK\"), rhs=trK),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"vetU0\"), rhs=vetU[0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"vetU1\"), rhs=vetU[1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"vetU2\"), rhs=vetU[2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"betU0\"), rhs=betU[0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"betU1\"), rhs=betU[1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"betU2\"), rhs=betU[2]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"alpha\"), rhs=alpha),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\", \"cf\"), rhs=cf)]\n",
"\n",
" outCparams = \"preindent=0,outCfileaccess=a,outCverbose=False,includebraces=False\"\n",
" all_but_lambdaU_outC = fin.FD_outputC(\"returnstring\", all_but_lambdaU_expressions, outCparams)\n",
Expand All @@ -1581,9 +1625,9 @@
" par.set_parval_from_str(\"finite_difference::FD_CENTDERIVS_ORDER\", FD_order)\n",
"\n",
" outCparams = \"preindent=1,outCfileaccess=a,outCverbose=False,includebraces=False\"\n",
" lambdaU_expressions = [lhrh(lhs=gri.gfaccess(\"in_gfs\",\"lambdaU0\"),rhs=IDlambdaU[0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\",\"lambdaU1\"),rhs=IDlambdaU[1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\",\"lambdaU2\"),rhs=IDlambdaU[2])]\n",
" lambdaU_expressions = [lhrh(lhs=gri.gfaccess(\"in_gfs\",\"lambdaU0\"),rhs=lambdaU[0]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\",\"lambdaU1\"),rhs=lambdaU[1]),\n",
" lhrh(lhs=gri.gfaccess(\"in_gfs\",\"lambdaU2\"),rhs=lambdaU[2])]\n",
" lambdaU_expressions_FDout = fin.FD_outputC(\"returnstring\",lambdaU_expressions, outCparams)\n",
"\n",
" lambdakernel = lp.loop([\"i2\",\"i1\",\"i0\"],[\"cctk_nghostzones[2]\",\"cctk_nghostzones[1]\",\"cctk_nghostzones[0]\"],\n",
Expand Down Expand Up @@ -1979,7 +2023,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.4"
"version": "3.11.1"
}
},
"nbformat": 4,
Expand Down

0 comments on commit 07dd7c6

Please sign in to comment.