Example #1
0
    def test_position_second_derivatives(self):
        """
            Performs finite difference testing of second derivatives of position
            vector.
        """
        [d2xdtheta2, d2xdzeta2, d2xdthetadzeta, d2ydtheta2, d2ydzeta2, \
            d2ydthetadzeta, d2zdtheta2, d2zdzeta2, d2zdthetadzeta] = \
            self.vmecOutput.position_second_derivatives()

        for itheta in range(0, self.vmecOutput.ntheta, 5):
            for izeta in range(0, self.vmecOutput.nzeta, 5):
                this_zeta = self.vmecOutput.zetas[izeta]
                this_theta = self.vmecOutput.thetas[itheta]
                d2xdthetadzeta_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.position_first_derivatives(-1, \
                    this_theta,zeta)[0], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(d2xdthetadzeta_fd, \
                                       d2xdthetadzeta[izeta,itheta], places=5)
                d2ydthetadzeta_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.position_first_derivatives(-1, \
                    this_theta,zeta)[2], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(d2ydthetadzeta_fd, \
                                       d2ydthetadzeta[izeta,itheta], places=5)
                d2zdthetadzeta_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.position_first_derivatives(-1, \
                    this_theta,zeta)[4], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(d2zdthetadzeta_fd, \
                                       d2zdthetadzeta[izeta,itheta], places=5)
                d2xdtheta2_fd = finiteDifferenceDerivative(this_theta,\
                    lambda theta : self.vmecOutput.position_first_derivatives(-1, \
                    theta,this_zeta)[0], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(d2xdtheta2_fd, \
                                       d2xdtheta2[izeta,itheta], places=5)
                d2ydtheta2_fd = finiteDifferenceDerivative(this_theta,\
                    lambda theta : self.vmecOutput.position_first_derivatives(-1, \
                    theta,this_zeta)[2], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(d2ydtheta2_fd, \
                                       d2ydtheta2[izeta,itheta], places=5)
                d2zdtheta2_fd = finiteDifferenceDerivative(this_theta,\
                    lambda theta : self.vmecOutput.position_first_derivatives(-1, \
                    theta,this_zeta)[4], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(d2zdtheta2_fd, \
                                       d2zdtheta2[izeta,itheta], places=5)
                d2xdzeta2_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.position_first_derivatives(-1, \
                    this_theta,zeta)[1], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(d2xdzeta2_fd, \
                                       d2xdzeta2[izeta,itheta], places=5)
                d2ydzeta2_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.position_first_derivatives(-1, \
                    this_theta,zeta)[3], epsilon=1e-5, method='centered')
                self.assertAlmostEqual(d2ydzeta2_fd, \
                                       d2ydzeta2[izeta,itheta], places=5)
                d2zdzeta2_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.position_first_derivatives(-1, \
                    this_theta,zeta)[5], epsilon=1e-5, method='centered')
                self.assertAlmostEqual(d2zdzeta2_fd, \
                                       d2zdzeta2[izeta,itheta], places=5)
Example #2
0
    def test_radius_derivatives(self):
        """
            Performs finite difference testing of derivative of radius with 
            respect to boundary harmonics
        """
        def temp_fun_rmnc(im, rmnc):
            rmnc_init = self.vmecOutput.rmnc[-1, im]
            self.vmecOutput.rmnc[-1, im] = rmnc
            [X, Y, Z, R] = self.vmecOutput.compute_position()
            self.vmecOutput.rmnc[-1, im] = rmnc_init
            return R

        # Check first 10 modes
        xm_sensitivity = self.vmecOutput.xm[0:10]
        xn_sensitivity = self.vmecOutput.xn[0:10] / self.vmecOutput.nfp

        [dRdrmnc, dRdzmns] = self.vmecOutput.radius_derivatives(\
                xm_sensitivity, xn_sensitivity)

        for im in range(len(xm_sensitivity)):
            this_rmnc = self.vmecOutput.rmnc[-1, im]
            dRdrmnc_fd = finiteDifferenceDerivative(this_rmnc,\
                lambda rmnc : temp_fun_rmnc(im, rmnc), epsilon=1e-5, \
                method='centered')
            for izeta in range(self.vmecOutput.nzeta):
                for itheta in range(self.vmecOutput.ntheta):
                    self.assertAlmostEqual(dRdrmnc_fd[izeta, itheta], \
                        dRdrmnc[im, izeta, itheta], places=5)
                    self.assertEqual(0, dRdzmns[im, izeta, itheta])
Example #3
0
    def test_normalized_jacobian_derivatives(self):
        """
            Performs finite difference testing of derivative of normalized
            jacobian with respect to boundary harmonics
        """
        def temp_fun_rmnc(im, rmnc):
            rmnc_init = self.vmecOutput.rmnc[-1, im]
            self.vmecOutput.rmnc[-1, im] = rmnc
            normalized_jacobian = self.vmecOutput.normalized_jacobian()
            self.vmecOutput.rmnc[-1, im] = rmnc_init
            return normalized_jacobian

        def temp_fun_zmns(im, zmns):
            zmns_init = self.vmecOutput.zmns[-1, im]
            self.vmecOutput.zmns[-1, im] = zmns
            normalized_jacobian = self.vmecOutput.normalized_jacobian()
            self.vmecOutput.zmns[-1, im] = zmns_init
            return normalized_jacobian

        # Check first 10 modes
        xm_sensitivity = self.vmecOutput.xm[0:10]
        xn_sensitivity = self.vmecOutput.xn[0:10] / self.vmecOutput.nfp

        [dnormalized_jacobiandrmnc, dnormalized_jacobiandzmns] = \
            self.vmecOutput.normalized_jacobian_derivatives(xm_sensitivity, \
                                                            xn_sensitivity)

        for im in range(len(xm_sensitivity)):
            this_rmnc = self.vmecOutput.rmnc[-1, im]
            this_zmns = self.vmecOutput.zmns[-1, im]
            dnormalized_jacobiandrmnc_fd = finiteDifferenceDerivative(this_rmnc,\
                lambda rmnc : temp_fun_rmnc(im,rmnc), epsilon=1e-5, \
                method='centered')
            dnormalized_jacobiandzmns_fd = finiteDifferenceDerivative(this_zmns,\
                lambda zmns : temp_fun_zmns(im,zmns), epsilon=1e-5, \
                method='centered')
            for izeta in range(self.vmecOutput.nzeta):
                for itheta in range(self.vmecOutput.ntheta):
                    self.assertAlmostEqual(dnormalized_jacobiandrmnc_fd[izeta,itheta], \
                        dnormalized_jacobiandrmnc[im,izeta,itheta], places=5)
                    self.assertAlmostEqual(dnormalized_jacobiandzmns_fd[izeta,itheta], \
                        dnormalized_jacobiandzmns[im,izeta,itheta], places=5)
Example #4
0
    def area_derivatives(self):
        """
            Performs finite difference testing of derivative of area with 
            respect to boundary harmonics
        """
        def temp_fun_rmnc(im, rmnc):
            rmnc_init = self.vmecOutput.rmnc[-1, im]
            self.vmecOutput.rmnc[-1, im] = rmnc
            area = self.vmecOutput.area()
            self.vmecOutput.rmnc[-1, im] = rmnc_init
            return area

        def temp_fun_zmns(im, rmnc):
            zmns_init = self.vmecOutput.zmns[-1, im]
            self.vmecOutput.zmns[-1, im] = zmns
            area = self.vmecOutput.area()
            self.vmecOutput.zmns[-1, im] = zmns_init
            return area

        # Check first 10 modes
        xm_sensitivity = self.vmecOutput.xm[0:10]
        xn_sensitivity = self.vmecOutput.xn[0:10] / self.vmecOutput.nfp

        [dareadrmnc, dareadzmns] = self.vmecOutput.area_derivatives(\
                xm_sensitivity, xn_sensitivity)

        for im in range(len(xm_sensitivity)):
            this_rmnc = self.vmecOutput.rmnc[-1, im]
            this_zmns = self.vmecOutput.zmns[-1, im]
            dareadrmnc_fd = finiteDifferenceDerivative(this_rmnc,\
                lambda rmnc : temp_fun_rmnc(im, rmnc), epsilon=1e-5, \
                method='centered')
            dareadzmns_fd = finiteDifferenceDerivative(this_zmns,\
                lambda zmns : temp_fun_zmns(im, zmns), epsilon=1e-5, \
                method='centered')
            self.assertAlmostEqual(dareadrmnc_fd[izeta, itheta], \
                dareadrmnc[im, izeta, itheta], places=5)
Example #5
0
    def test_position_first_derivatives(self):
        """
            Checks that derivatives of position vector integrate to zero
            over full grid and performs finite difference testing.
        """
        [dxdtheta, dxdzeta, dydtheta, dydzeta, dzdtheta, dzdzeta] = \
            self.vmecOutput.position_first_derivatives(\
                theta=self.vmecOutput.thetas_2d_full,
                zeta=self.vmecOutput.zetas_2d_full)
        dxdtheta_sum = np.sum(dxdtheta) * self.vmecOutput.dtheta \
            * self.vmecOutput.dzeta * self.vmecOutput.nfp
        dxdzeta_sum = np.sum(dxdzeta) * self.vmecOutput.dtheta \
            * self.vmecOutput.dzeta * self.vmecOutput.nfp
        dydtheta_sum = np.sum(dydtheta) * self.vmecOutput.dtheta \
            * self.vmecOutput.dzeta * self.vmecOutput.nfp
        dydzeta_sum = np.sum(dydzeta) * self.vmecOutput.dtheta \
            * self.vmecOutput.dzeta * self.vmecOutput.nfp
        dzdtheta_sum = np.sum(dzdtheta) * self.vmecOutput.dtheta \
            * self.vmecOutput.dzeta * self.vmecOutput.nfp
        dzdzeta_sum = np.sum(dzdzeta) * self.vmecOutput.dtheta \
            * self.vmecOutput.dzeta * self.vmecOutput.nfp
        self.assertAlmostEqual(dxdtheta_sum, 0)
        self.assertAlmostEqual(dxdzeta_sum, 0)
        self.assertAlmostEqual(dydtheta_sum, 0)
        self.assertAlmostEqual(dydzeta_sum, 0)
        self.assertAlmostEqual(dzdtheta_sum, 0)
        self.assertAlmostEqual(dzdzeta_sum, 0)

        for itheta in range(0, self.vmecOutput.ntheta, 5):
            for izeta in range(0, self.vmecOutput.nzeta, 5):
                this_zeta = self.vmecOutput.zetas[izeta]
                this_theta = self.vmecOutput.thetas[itheta]
                dxdzeta_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.compute_position(-1, \
                    this_theta,zeta)[0], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(dxdzeta_fd,
                                       dxdzeta[izeta, itheta],
                                       places=5)
                dydzeta_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.compute_position(-1, \
                    this_theta,zeta)[1], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(dydzeta_fd,
                                       dydzeta[izeta, itheta],
                                       places=5)
                dzdzeta_fd = finiteDifferenceDerivative(this_zeta,\
                    lambda zeta : self.vmecOutput.compute_position(-1, \
                    this_theta,zeta)[2], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(dzdzeta_fd,
                                       dzdzeta[izeta, itheta],
                                       places=5)
                dxdtheta_fd = finiteDifferenceDerivative(this_theta,\
                    lambda theta : self.vmecOutput.compute_position(-1, \
                    theta,this_zeta,)[0], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(dxdtheta_fd,
                                       dxdtheta[izeta, itheta],
                                       places=5)
                dydtheta_fd = finiteDifferenceDerivative(this_theta,\
                    lambda theta : self.vmecOutput.compute_position(-1, \
                    theta,this_zeta)[1], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(dydtheta_fd,
                                       dydtheta[izeta, itheta],
                                       places=5)
                dzdtheta_fd = finiteDifferenceDerivative(this_theta,\
                    lambda theta : self.vmecOutput.compute_position(-1, \
                    theta,this_zeta)[2], epsilon=1e-5 ,method='centered')
                self.assertAlmostEqual(dzdtheta_fd,
                                       dzdtheta[izeta, itheta],
                                       places=5)