def Gyy_shifted(field, cosphi, sinphi, space_order): """ 3D rotated second order derivative in the direction y as an average of two non-centered rotated second order derivative in the direction y :param field: symbolic data whose derivative we are computing :param cosphi: cosine of the azymuth angle :param sinphi: sine of the azymuth angle :param space_order: discretization order :return: rotated second order derivative wrt y """ x, y = field.space_dimensions[:2] Gyp = (sinphi * field.dx - cosphi * field.dyr) Gyy = (first_derivative(Gyp * sinphi, dim=x, side=centered, order=space_order, matvec=transpose) - first_derivative(Gyp * cosphi, dim=y, side=right, order=space_order, matvec=transpose)) Gyp2 = (sinphi * field.dxr - cosphi * field.dy) Gyy2 = (first_derivative(Gyp2 * sinphi, dim=x, side=right, order=space_order, matvec=transpose) - first_derivative(Gyp2 * cosphi, dim=y, side=centered, order=space_order, matvec=transpose)) return -.5 * (Gyy + Gyy2)
def Gzz_centered_2d(model, field, costheta, sintheta, space_order): """ 2D rotated second order derivative in the direction z. Parameters ---------- field : Function Input for which the derivative is computed. costheta : Function or float Cosine of the tilt angle. sintheta : Function or float Sine of the tilt angle. space_order : int Space discretization order. Returns ------- Rotated second order derivative w.r.t. z. """ order1 = space_order // 2 x, y = model.space_dimensions[:2] Gz = -(sintheta * first_derivative( field, dim=x, side=centered, fd_order=order1) + costheta * first_derivative(field, dim=y, side=centered, fd_order=order1)) Gzz = (first_derivative( Gz * sintheta, dim=x, side=centered, fd_order=order1, matvec=transpose ) + first_derivative( Gz * costheta, dim=y, side=centered, fd_order=order1, matvec=transpose)) return Gzz
def Gzz_shifted_2d(field, costheta, sintheta, space_order): """ 2D rotated second order derivative in the direction z as an average of two non-centered rotated second order derivative in the direction z :param field: symbolic data whose derivative we are computing :param costheta: cosine of the tilt :param sintheta: sine of the tilt :param space_order: discretization order :return: rotated second order derivative wrt z """ x, y = field.space_dimensions[:2] Gz1r = (sintheta * field.dxr + costheta * field.dy) Gzz1 = (first_derivative(Gz1r * sintheta, dim=x, side=right, order=space_order, matvec=transpose) + first_derivative(Gz1r * costheta, dim=y, side=centered, order=space_order, matvec=transpose)) Gz2r = (sintheta * field.dx + costheta * field.dyr) Gzz2 = (first_derivative(Gz2r * sintheta, dim=x, side=centered, order=space_order, matvec=transpose) + first_derivative(Gz2r * costheta, dim=y, side=right, order=space_order, matvec=transpose)) return -.5 * (Gzz1 + Gzz2)
def Gxx_shifted_2d(field, costheta, sintheta, space_order): """ 2D rotated second order derivative in the direction x as an average of two non-centered rotated second order derivative in the direction x :param field: symbolic data whose derivative we are computing :param costheta: cosine of the tilt angle :param sintheta: sine of the tilt angle :param space_order: discretization order :return: rotated second order derivative wrt x """ x, y = field.space_dimensions[:2] Gx1 = (costheta * field.dxr - sintheta * field.dy) Gxx1 = (first_derivative(Gx1 * costheta, dim=x, side=right, order=space_order, matvec=transpose) - first_derivative(Gx1 * sintheta, dim=y, side=centered, order=space_order, matvec=transpose)) Gx2p = (costheta * field.dx - sintheta * field.dyr) Gxx2 = (first_derivative(Gx2p * costheta, dim=x, side=centered, order=space_order, matvec=transpose) - first_derivative(Gx2p * sintheta, dim=y, side=right, order=space_order, matvec=transpose)) return -.5 * (Gxx1 + Gxx2)
def Gzz_centered_2d(field, costheta, sintheta, space_order): """ 2D rotated second order derivative in the direction z :param field: symbolic data whose derivative we are computing :param costheta: cosine of the tilt angle :param sintheta: sine of the tilt angle :param space_order: discretization order :return: rotated second order derivative wrt z """ order1 = space_order / 2 x, y = field.space_dimensions[:2] Gz = -(sintheta * first_derivative(field, dim=x, side=centered, order=order1) + costheta * first_derivative(field, dim=y, side=centered, order=order1)) Gzz = (first_derivative(Gz * sintheta, dim=x, side=centered, order=order1, matvec=transpose) + first_derivative(Gz * costheta, dim=y, side=centered, order=order1, matvec=transpose)) return Gzz
def Gzz_centered_2d(field, costheta, sintheta, space_order): """ 2D rotated second order derivative in the direction z :param field: symbolic data whose derivative we are computing :param costheta: cosine of the tilt angle :param sintheta: sine of the tilt angle :param space_order: discretization order :return: rotated second order derivative wrt z """ order1 = space_order / 2 x, y = field.space_dimensions[:2] Gz = -(sintheta * first_derivative(field, dim=x, side=centered, fd_order=order1) + costheta * first_derivative(field, dim=y, side=centered, fd_order=order1)) Gzz = (first_derivative(Gz * sintheta, dim=x, side=centered, fd_order=order1, matvec=transpose) + first_derivative(Gz * costheta, dim=y, side=centered, fd_order=order1, matvec=transpose)) return Gzz
def Gzz2d(field, costheta, sintheta, rho): """ 3D rotated second order derivative in the direction z :param field: symbolic data whose derivative we are computing :param costheta: cosine of the tilt angle :param sintheta: sine of the tilt angle :param cosphi: cosine of the azymuth angle :param sinphi: sine of the azymuth angle :param space_order: discretization order :return: rotated second order derivative wrt ztranspose """ order1 = field.space_order // 2 func = list(retrieve_functions(field))[0] x, z = func.space_dimensions Gz = -(sintheta * first_derivative(field, dim=x, side=centered, fd_order=order1) + costheta * first_derivative(field, dim=z, side=centered, fd_order=order1)) Gzz = (first_derivative(Gz * sintheta * rho, dim=x, side=centered, fd_order=order1, matvec=transpose) + first_derivative(Gz * costheta * rho, dim=z, side=centered, fd_order=order1, matvec=transpose)) return Gzz
def Gxx_shifted(field, costheta, sintheta, cosphi, sinphi, space_order): """ 3D rotated second order derivative in the direction x as an average of two non-centered rotated second order derivative in the direction x :param field: symbolic data whose derivative we are computing :param costheta: cosine of the tilt angle :param sintheta: sine of the tilt angle :param cosphi: cosine of the azymuth angle :param sinphi: sine of the azymuth angle :param space_order: discretization order :return: rotated second order derivative wrt x """ x, y, z = field.space_dimensions Gx1 = (costheta * cosphi * field.dx + costheta * sinphi * field.dyr - sintheta * field.dzr) Gxx1 = (first_derivative(Gx1 * costheta * cosphi, dim=x, side=centered, fd_order=space_order, matvec=transpose) + first_derivative(Gx1 * costheta * sinphi, dim=y, side=right, fd_order=space_order, matvec=transpose) - first_derivative(Gx1 * sintheta, dim=z, side=right, fd_order=space_order, matvec=transpose)) Gx2 = (costheta * cosphi * field.dxr + costheta * sinphi * field.dy - sintheta * field.dz) Gxx2 = (first_derivative(Gx2 * costheta * cosphi, dim=x, side=right, fd_order=space_order, matvec=transpose) + first_derivative(Gx2 * costheta * sinphi, dim=y, side=centered, fd_order=space_order, matvec=transpose) - first_derivative(Gx2 * sintheta, dim=z, side=centered, fd_order=space_order, matvec=transpose)) return -.5 * (Gxx1 + Gxx2)
def Gzz_shifted(field, costheta, sintheta, cosphi, sinphi, space_order): """ 3D rotated second order derivative in the direction z as an average of two non-centered rotated second order derivative in the direction z :param field: symbolic data whose derivative we are computing :param costheta: cosine of the tilt angle :param sintheta: sine of the tilt angle :param cosphi: cosine of the azymuth angle :param sinphi: sine of the azymuth angle :param space_order: discretization order :return: rotated second order derivative wrt z """ x, y, z = field.space_dimensions Gzr = (sintheta * cosphi * field.dx + sintheta * sinphi * field.dyr + costheta * field.dzr) Gzz = (first_derivative(Gzr * sintheta * cosphi, dim=x, side=centered, order=space_order, matvec=transpose) + first_derivative(Gzr * sintheta * sinphi, dim=y, side=right, order=space_order, matvec=transpose) + first_derivative(Gzr * costheta, dim=z, side=right, order=space_order, matvec=transpose)) Gzr2 = (sintheta * cosphi * field.dxr + sintheta * sinphi * field.dy + costheta * field.dz) Gzz2 = (first_derivative(Gzr2 * sintheta * cosphi, dim=x, side=right, order=space_order, matvec=transpose) + first_derivative(Gzr2 * sintheta * sinphi, dim=y, side=centered, order=space_order, matvec=transpose) + first_derivative(Gzr2 * costheta, dim=z, side=centered, order=space_order, matvec=transpose)) return -.5 * (Gzz + Gzz2)