Last active
April 29, 2023 14:46
-
-
Save PetrKryslUCSD/0838a67c28b6f3c3400a0115ea852d88 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| module mwe | |
| using LinearAlgebra: dot, norm | |
| using Statistics: mean | |
| using Cthulhu | |
| using InteractiveUtils | |
| cmplx(r, c) = r + im * c | |
| size3(v) = norm(v) | |
| ssize3(v) = v[1]^2 + v[2]^2 + v[3]^2 | |
| dot3(v, w) = dot(v, w) | |
| function off_triangle_rule(ir) | |
| p, w = ir.param_coords, vec(ir.weights) | |
| xqoff = vec(p[:, 1]) | |
| yqoff = vec(p[:, 2]) | |
| wqoff = deepcopy(w) .*= 2 | |
| return xqoff, yqoff, wqoff | |
| end | |
| function on_triangle_rule(ir) | |
| xqoff, yqoff, wqoff = off_triangle_rule(ir) | |
| nqoff = length(wqoff) | |
| nqon=3*nqoff | |
| z = 0.0 | |
| xqon = fill(z, nqon) | |
| yqon = fill(z, nqon) | |
| wqon = fill(z, nqon) | |
| for iq in 1:nqoff | |
| xqon[iq] = xqoff[iq]*(1/3)+yqoff[iq] | |
| yqon[iq] = xqoff[iq]*(1/3) | |
| wqon[iq] = wqoff[iq]/3 | |
| xqon[iq+nqoff] = xqoff[iq]*(1/3) | |
| yqon[iq+nqoff] = xqoff[iq]*(1/3)+yqoff[iq] | |
| wqon[iq+nqoff] = wqoff[iq]/3 | |
| xqon[iq+2*nqoff] = (1/3)*(1+2*xqoff[iq]-yqoff[iq]) | |
| yqon[iq+2*nqoff] = (1/3)*(1-xqoff[iq]+2*yqoff[iq]) | |
| wqon[iq+2*nqoff] = wqoff[iq]/3 | |
| end | |
| return xqon, yqon, wqon | |
| end | |
| function area(qa, qb, qc) | |
| a1, a2, a3 = qb[1] - qa[1], qb[2] - qa[2], qb[3] - qa[3] | |
| b1, b2, b3 = qc[1] - qa[1], qc[2] - qa[2], qc[3] - qa[3] | |
| n1 = a2*b3-a3*b2 | |
| n2 = a3*b1-a1*b3 | |
| n3 = a1*b2-a2*b1 | |
| return sqrt(n1^2 + n2^2 + n3^2) / 2 | |
| end | |
| function f( | |
| k, | |
| p, | |
| vecp, | |
| qa, | |
| qb, | |
| qc, | |
| lponel, | |
| xq, | |
| yq, | |
| wq, | |
| llk, | |
| lmk, | |
| lmkt, | |
| lnk, | |
| temps | |
| ) | |
| pa, normq, ar0, ara, aopp, q, rr, qbmqa, qcmqa, qcmqb, pmqa, pmqb, pmqc = temps | |
| zero = 0.0 | |
| one = 1.0 | |
| two = 2.0 | |
| three = 3.0 | |
| four = 4.0 | |
| third = 1.0 / 3.0 | |
| fourpi = four * pi | |
| czero = cmplx(zero, zero) | |
| cone = cmplx(one, zero) | |
| cimag = cmplx(zero, one) | |
| ek = 1.0e-16 | |
| egeom = 0.0 | |
| lvalid = false | |
| @. qbmqa = qb - qa | |
| @. qcmqa = qc - qa | |
| @. qcmqb = qc - qb | |
| @. pmqa = p - qa | |
| @. pmqb = p - qb | |
| @. pmqc = p - qc | |
| qarea = area(qa, qb, qc) | |
| lfail = false | |
| lerror = false | |
| llorn = llk || lnk | |
| lmorn = lmk || lnk | |
| lmsorn = lmk || lmkt || lnk | |
| lmtorn = lmkt || lnk | |
| lmormt = lmk || lmkt | |
| if (lponel) | |
| lmksv = lmk | |
| lmktsv = lmkt | |
| lmk = false | |
| lmkt = false | |
| end | |
| if (lmorn) | |
| normq[1] = qbmqa[2] * qcmqa[3] - qbmqa[3] * qcmqa[2] | |
| normq[2] = qcmqa[1] * qbmqa[3] - qbmqa[1] * qcmqa[3] | |
| normq[3] = qbmqa[1] * qcmqa[2] - qbmqa[2] * qcmqa[1] | |
| acrss = size3(normq) | |
| normq ./= acrss | |
| end | |
| if (lnk) | |
| dnpnq = dot3(vecp, normq) | |
| end | |
| imk = imag(k) | |
| rek = real(k) | |
| sk = k * k | |
| sko2 = sk / two | |
| resko2 = real(sko2) | |
| kzero = false | |
| kreal = false | |
| kimag = false | |
| kcomp = false | |
| if (abs(rek) < ek && abs(imk) < ek) | |
| kzero = true | |
| elseif (abs(imk) < ek) | |
| kreal = true | |
| elseif (abs(rek) < ek) | |
| kimag = true | |
| else | |
| kcomp = true | |
| end | |
| csuml = czero | |
| csumm = czero | |
| csummt = czero | |
| csumn = czero | |
| if (lponel && llorn) | |
| rqbqc = size3(qcmqb) | |
| rqcqa = size3(qcmqa) | |
| rqaqb = size3(qbmqa) | |
| rqap = size3(pmqa) | |
| rqbp = size3(pmqb) | |
| rqcp = size3(pmqc) | |
| ar0 .= (rqap, rqbp, rqcp) | |
| ara .= (rqbp, rqcp, rqap) | |
| aopp .= (rqaqb, rqbqc, rqcqa) | |
| @inbounds for ii = 1:3 | |
| r0 = ar0[ii] | |
| ra = ara[ii] | |
| opp = aopp[ii] | |
| if (r0 < ra) | |
| temp = ra | |
| ra = r0 | |
| r0 = temp | |
| end | |
| sr0 = r0 * r0 | |
| sra = ra * ra | |
| sopp = opp * opp | |
| a = acos((sra + sr0 - sopp) / two / ra / r0) | |
| b = atan(ra * sin(a) / (r0 - ra * cos(a))) | |
| csuml += cmplx( | |
| (r0 * sin(b) * (log(tan((b + a) / two)) - log(tan(b / two)))) / qarea, | |
| zero, | |
| ) | |
| csumn += cmplx((cos(b + a) - cos(b)) / r0 / sin(b) / qarea, zero) | |
| end | |
| end | |
| csumn = csumn - sko2 * csuml | |
| if (lponel && kzero) | |
| return czero | |
| end | |
| nq = length(xq) | |
| for iq = 1:nq | |
| wqiq = wq[iq] | |
| @. q = qa + xq[iq] * qbmqa + yq[iq] * qcmqa | |
| @. rr = p - q | |
| sr = ssize3(rr) | |
| r = sqrt(sr) | |
| if (lnk) | |
| cr = r * sr | |
| end | |
| if (lmorn) | |
| rnq = -dot3(rr, normq) / r | |
| end | |
| if (lmtorn) | |
| rnp = dot3(rr, vecp) / r | |
| end | |
| if (lnk) | |
| rnprnq = rnp * rnq | |
| end | |
| if (lnk) | |
| rnpnq = -(dnpnq + rnprnq) / r | |
| end | |
| if (lponel && (!kzero)) | |
| if (llorn) | |
| fpg0 = one / r | |
| end | |
| if (lmsorn) | |
| fpg0r = -one / sr | |
| end | |
| if (lnk) | |
| fpg0rr = two / cr | |
| end | |
| end | |
| fpg, fpgr, wfpgr = czero, czero, czero | |
| if (kzero) | |
| if (llk) | |
| fpg = cmplx(one / r, zero) | |
| end | |
| if (llk) | |
| csuml += cmplx(wqiq * real(fpg), zero) | |
| end | |
| if (lmsorn) | |
| fpgr = cmplx(-one / sr, zero) | |
| end | |
| if (lmormt) | |
| wfpgr = cmplx(wqiq * real(fpgr), zero) | |
| end | |
| if (lmk) | |
| csumm += cmplx(real(wfpgr) * rnq, zero) | |
| end | |
| if (lmkt) | |
| csummt += cmplx(real(wfpgr) * rnp, zero) | |
| end | |
| if (lnk) | |
| fpgrr = cmplx(two / cr, zero) | |
| csumn += cmplx(wqiq * (real(fpgr) * rnpnq + real(fpgrr) * rnprnq), zero) | |
| end | |
| elseif (kreal) | |
| kr = cmplx(real(k) * r, zero) | |
| ikr = cmplx(zero, real(kr)) | |
| skr = cmplx(real(kr) * real(kr), zero) | |
| e = exp(ikr) | |
| if (llk) | |
| fpg = e / r | |
| end | |
| if (llk) | |
| if (!lponel) | |
| csuml += wqiq * fpg | |
| else | |
| csuml += wqiq * (fpg - fpg0) | |
| end | |
| end | |
| if (lmsorn) | |
| eosr = e / sr | |
| fpgr = im*(eosr) * real(kr) - eosr | |
| end | |
| if ((!lponel) && lmormt) | |
| wfpgr = wqiq * fpgr | |
| if (lmk) | |
| csumm += wfpgr * rnq | |
| end | |
| if (lmkt) | |
| csummt += + wfpgr * rnp | |
| end | |
| end | |
| if (lnk) | |
| fpgrr = e * (two - ikr - ikr - skr) / cr | |
| if (!lponel) | |
| csumn += wqiq * (fpgr * rnpnq + fpgrr * rnprnq) | |
| else | |
| csumn += wqiq * | |
| ((fpgr - fpg0r) * rnpnq + (fpgrr - fpg0rr) * rnprnq + resko2 * fpg0) | |
| end | |
| end | |
| elseif (kimag) | |
| imkr = imk * r | |
| rekr = zero | |
| kr = cmplx(rekr, imkr) | |
| ikr = cmplx(-imkr, rekr) | |
| skr = cmplx(-imkr * imkr, zero) | |
| e = exp(ikr) | |
| if (llk) | |
| fpg = cmplx(real(e) / r, zero) | |
| end | |
| if (llk) | |
| if (!lponel) | |
| csuml += cmplx(wqiq * real(fpg), zero) | |
| end | |
| if (lponel) | |
| csuml += cmplx(wqiq * real(fpg - fpg0), zero) | |
| end | |
| end | |
| if (lmsorn) | |
| eosr = cmplx(real(e) / sr, zero) | |
| fpgr = cmplx(real(eosr) * real(ikr - one), zero) | |
| end | |
| if ((!lponel) && lmormt) | |
| wfpgr = cmplx(wqiq * real(fpgr), zero) | |
| if (lmk) | |
| csumm += cmplx(real(wfpgr) * rnq, zero) | |
| end | |
| if (lmkt) | |
| csummt += cmplx(real(wfpgr) * rnp, zero) | |
| end | |
| end | |
| if (lnk) | |
| fpgrr = cmplx(real(e) * real(two - ikr - ikr - skr) / cr, zero) | |
| if (!lponel) | |
| csumn += cmplx(wqiq * (real(fpgr) * rnpnq + real(fpgrr) * rnprnq), zero) | |
| else | |
| csumn += cmplx( | |
| wqiq * ( | |
| real(fpgr - fpg0r) * rnpnq + | |
| real(fpgrr - fpg0rr) * rnprnq + | |
| resko2 * fpg0 | |
| ), | |
| zero, | |
| ) | |
| end | |
| end | |
| elseif (kcomp) | |
| kr = k * r | |
| ikr = im * (kr) | |
| skr = sk * sr | |
| e = exp(ikr) | |
| if (llk) | |
| fpg = e / r | |
| end | |
| if (llk) | |
| if (!lponel) | |
| csuml += wqiq * fpgv | |
| end | |
| if (lponel) | |
| csuml += wqiq * (fpg - fpg0) | |
| end | |
| end | |
| if (lmsorn) | |
| eosr = e / sr | |
| fpgr = im * (eosr) * kr - eosr | |
| end | |
| if ((!lponel) && lmormt) | |
| wfpgr = wqiq * fpgr | |
| if (lmk) | |
| csumm += wfpgr * rnq | |
| end | |
| if (lmkt) | |
| csummt += wfpgr * rnp | |
| end | |
| end | |
| if (lnk) | |
| fpgrr = e * (two - ikr - ikr - skr) / cr | |
| if (!lponel) | |
| csumn += wqiq * (fpgr * rnpnq + fpgrr * rnprnq) | |
| else | |
| csumn += wqiq * | |
| ((fpgr - fpg0r) * rnpnq + (fpgrr - fpg0rr) * rnprnq + sko2 * fpg0) | |
| end | |
| end | |
| end | |
| end | |
| qao4pi = qarea / fourpi | |
| if llk | |
| return dislk = qao4pi * csuml | |
| elseif lmk | |
| return dismk = qao4pi * csumm | |
| elseif lmkt | |
| return dismkt = qao4pi * csummt | |
| else | |
| return disnk = qao4pi * csumn | |
| end | |
| end | |
| k = 1.0 + 0.0 * im | |
| p = fill(0.0, 3) | |
| vecp = fill(0.0, 3); vecp[3] = 1 | |
| qa = fill(0.0, 3); | |
| qb = fill(0.0, 3); qb[1] = 1 | |
| qc = fill(0.0, 3); qc[2] = 1 | |
| lponel = false | |
| xq = fill(0.0, 3) | |
| yq = fill(0.0, 3) | |
| wq = fill(0.0, 3) | |
| llk = true | |
| lmk = false | |
| lmkt = false | |
| lnk = false | |
| temps = fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3), | |
| fill(zero(Float64), 3) | |
| @descend f( | |
| k, | |
| p, | |
| vecp, | |
| qa, | |
| qb, | |
| qc, | |
| lponel, | |
| xq, | |
| yq, | |
| wq, | |
| llk, | |
| lmk, | |
| lmkt, | |
| lnk, | |
| temps | |
| ) | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment