|
| 1 | +function cmfd_si(N=4096*4, Nx=512, Nc=64, na2=11; s=1.0, tol=1.e-10) |
| 2 | +outputok=true |
| 3 | +phi_c = zeros(Nc) |
| 4 | +phi_c0 = zeros(Nc) |
| 5 | +cmfd_data=cmfd_init(N, Nx, Nc, na2, s) |
| 6 | +linop_data=linop_init(Nc, cmfd_data) |
| 7 | +reshist=Float64[] |
| 8 | +resid=1.0 |
| 9 | +for iz=1:20 |
| 10 | + (phi_c, J_c) = cmfd_sweep(phi_c, cmfd_data) |
| 11 | + resid=norm(phi_c - phi_c0, Inf) |
| 12 | + push!(reshist, resid) |
| 13 | + phi_c0 .= phi_c |
| 14 | +end |
| 15 | +if outputok == true |
| 16 | +lin_resid=cmfd_matvec(phi_c, linop_data) - linop_data.frhs |
| 17 | +println(norm(lin_resid,Inf)) |
| 18 | +plot(phi_c) |
| 19 | +end |
| 20 | +return (sol=phi_c, reshist=reshist) |
| 21 | +end |
| 22 | + |
| 23 | + |
| 24 | +""" |
| 25 | +cmfd_krylov(N=4096*4, Nx=512, Nc=64, na2=11; s=1.0, tol=1.e-10) |
| 26 | +Solves the linear system you get from CMFD with GMRES. |
| 27 | +""" |
| 28 | +function cmfd_krylov(N=4096*4, Nx=512, Nc=64, na2=11; s=1.0, tol=1.e-10) |
| 29 | +phi_c = zeros(Nc) |
| 30 | +phi_c0 = zeros(Nc) |
| 31 | +cmfd_data=cmfd_init(N, Nx, Nc, na2, s) |
| 32 | +linop_data=linop_init(Nc, cmfd_data) |
| 33 | +b=linop_data.frhs |
| 34 | +V=zeros(Nc,20) |
| 35 | +eta=tol |
| 36 | +# |
| 37 | +# kl_gmres and kl_bicgstab solve the problem. |
| 38 | +# |
| 39 | +gout = kl_gmres(phi_c, b, cmfd_matvec, V, tol; pdata = linop_data) |
| 40 | +sol=gout.sol |
| 41 | +reshistg=gout.reshist |
| 42 | +(phi, J_c) = cmfd_sweep(sol, cmfd_data) |
| 43 | +return(sol=sol, J_c=J_c, reshistg=reshistg) |
| 44 | +end |
| 45 | + |
| 46 | +""" |
| 47 | +cmfd_sweep(phi_c, cmfd_data) |
| 48 | +
|
| 49 | +Returns coarse mesh cell average flux and current |
| 50 | +""" |
| 51 | +function cmfd_sweep(phi_c, cmfd_data) |
| 52 | +# |
| 53 | +# Map coarse mesh flux to fine mesh |
| 54 | +# |
| 55 | +phi_f = cmfd_data.phi_f |
| 56 | +ctof(phi_c,phi_f) |
| 57 | +# |
| 58 | +# Do Sam's QMC sweep |
| 59 | +# |
| 60 | +qmc_data=cmfd_data.qmc_data |
| 61 | +qmc_out=qmc_sweep(phi_f, qmc_data) |
| 62 | +phi_f = qmc_out.phi_avg |
| 63 | +# |
| 64 | +# Map output flux and current to coarse mesh |
| 65 | +# |
| 66 | +phi_c = ftoc(phi_f, phi_c) |
| 67 | +J_f = qmc_out.J_avg |
| 68 | +J_c = cmfd_data.J_c |
| 69 | +J_c = ftoc(J_f, J_c) |
| 70 | +return (phi_c, J_c) |
| 71 | +end |
| 72 | + |
| 73 | +""" |
| 74 | +cmfd_matvec(phi,linop_data) |
| 75 | +Matvec for CMFD-QMC |
| 76 | +Does a QMC transport sweep with flux phi, subtracts off the zero bc solution |
| 77 | +to obtain the linear integral operator. Then subtract that from the identity. |
| 78 | +""" |
| 79 | +function cmfd_matvec(phic,linop_data) |
| 80 | +phi_copy=linop_data.phi_copy |
| 81 | +phi_copy .= phic |
| 82 | +frhs=linop_data.frhs |
| 83 | +cmfd_data=linop_data.cmfd_data |
| 84 | +(phi_c, J_c) =cmfd_sweep(phi_copy,cmfd_data) |
| 85 | +Mprod=phic-(phi_c - frhs) |
| 86 | +return Mprod |
| 87 | +end |
| 88 | + |
| 89 | + |
| 90 | +function cmfd_init(N, Nx, Nc, na2, s) |
| 91 | +phi_f = zeros(Nx) |
| 92 | +J_c = zeros(Nc) |
| 93 | +qmc_data = qmc_init(N, Nx, na2, s); |
| 94 | +return(phi_f=phi_f, J_c = J_c, qmc_data=qmc_data) |
| 95 | +end |
| 96 | + |
| 97 | +function linop_init(Nc, cmfd_data) |
| 98 | +nullin=zeros(Nc) |
| 99 | +phi_copy=zeros(Nc) |
| 100 | +(frhs, Jrhs)=cmfd_sweep(nullin, cmfd_data) |
| 101 | +return (frhs = frhs, cmfd_data = cmfd_data, phi_copy = phi_copy) |
| 102 | +end |
0 commit comments