コード例 #1
0
def calculateEsurf(surf_array, field_array, param, kernel):

    REAL = param.REAL

    par_reac = parameters()
    par_reac = param
    par_reac.threshold = 0.05
    par_reac.P = 7
    par_reac.theta = 0.0
    par_reac.Nm = (par_reac.P + 1) * (par_reac.P + 2) * (par_reac.P + 3) / 6

    ind_reac = index_constant()
    computeIndices(par_reac.P, ind_reac)
    precomputeTerms(par_reac.P, ind_reac)

    par_reac.Nk = 13  # Number of Gauss points per side for semi-analytical integrals

    cal2J = 4.184
    C0 = param.qe**2 * param.Na * 1e-3 * 1e10 / (cal2J * param.E_0)
    E_surf = []

    ff = -1
    for f in param.E_field:
        parent_surf = surf_array[field_array[f].parent[0]]

        if parent_surf.surf_type == 'dirichlet_surface':
            ff += 1
            print 'Calculating surface energy around region %i, stored in E_surf[%i]' % (
                f, ff)
            Esurf_aux = -numpy.sum(-parent_surf.Eout * parent_surf.dphi *
                                   parent_surf.phi * parent_surf.Area)
            E_surf.append(0.5 * C0 * Esurf_aux)

        elif parent_surf.surf_type == 'neumann_surface':
            ff += 1
            print 'Calculating surface energy around region %i, stored in E_surf[%i]' % (
                f, ff)
            Esurf_aux = numpy.sum(-parent_surf.Eout * parent_surf.dphi *
                                  parent_surf.phi * parent_surf.Area)
            E_surf.append(0.5 * C0 * Esurf_aux)

    return E_surf
コード例 #2
0
ファイル: matrixfree.py プロジェクト: LEONOB2014/pygbe
def calculateEsurf(surf_array, field_array, param, kernel):

    REAL = param.REAL

    par_reac = parameters()
    par_reac = param
    par_reac.threshold = 0.05
    par_reac.P = 7
    par_reac.theta = 0.0
    par_reac.Nm= (par_reac.P+1)*(par_reac.P+2)*(par_reac.P+3)/6

    ind_reac = index_constant()
    computeIndices(par_reac.P, ind_reac)
    precomputeTerms(par_reac.P, ind_reac)

    par_reac.Nk = 13         # Number of Gauss points per side for semi-analytical integrals

    cal2J = 4.184
    C0 = param.qe**2*param.Na*1e-3*1e10/(cal2J*param.E_0)
    E_surf = []

    ff = -1
    for f in param.E_field:
        parent_surf = surf_array[field_array[f].parent[0]]
         
        if parent_surf.surf_type == 'dirichlet_surface':
            ff += 1
            print 'Calculating surface energy around region %i, stored in E_surf[%i]'%(f,ff)
            Esurf_aux = -sum(-parent_surf.Eout*parent_surf.dphi*parent_surf.phi*parent_surf.Area) 
            E_surf.append(0.5*C0*Esurf_aux)
        
        elif parent_surf.surf_type == 'neumann_surface':
            ff += 1
            print 'Calculating surface energy around region %i, stored in E_surf[%i]'%(f,ff)
            Esurf_aux = sum(-parent_surf.Eout*parent_surf.dphi*parent_surf.phi*parent_surf.Area) 
            E_surf.append(0.5*C0*Esurf_aux)

    return E_surf
コード例 #3
0
param.N = 0
param.Neq = 0
for s in surf_array:
    N_aux = len(s.triangle)
    param.N += N_aux
    if s.surf_type == 'dirichlet_surface' or s.surf_type == 'neumann_surface' or s.surf_type == 'asc_surface':
        param.Neq += N_aux
    else:
        param.Neq += 2 * N_aux
print '\nTotal elements : %i' % param.N
print 'Total equations: %i' % param.Neq

printSummary(surf_array, field_array, param)

### Precomputation
ind0 = index_constant()
computeIndices(param.P, ind0)
precomputeTerms(param.P, ind0)

### Load CUDA code
kernel = kernels(param.BSZ, param.Nm, param.K_fine, param.P, precision)

### Generate interaction list
print 'Generate interaction list'
tic = time.time()
generateList(surf_array, field_array, param)
toc = time.time()
list_time = toc - tic

### Transfer data to GPU
print 'Transfer data to GPU'
コード例 #4
0
ファイル: main.py プロジェクト: lunyang/pygbe
param.N   = 0
param.Neq = 0
for s in surf_array:
    N_aux = len(s.triangle)
    param.N += N_aux
    if s.surf_type == 'dirichlet_surface' or s.surf_type == 'neumann_surface' or s.surf_type == 'asc_surface':
        param.Neq += N_aux
    else:
        param.Neq += 2*N_aux
print '\nTotal elements : %i'%param.N
print 'Total equations: %i'%param.Neq

printSummary(surf_array, field_array, param)

### Precomputation
ind0 = index_constant()
computeIndices(param.P, ind0)
precomputeTerms(param.P, ind0)

### Load CUDA code
kernel = kernels(param.BSZ, param.Nm, param.K_fine, param.P, precision)

### Generate interaction list
print 'Generate interaction list'
tic = time.time()
generateList(surf_array, field_array, param)
toc = time.time()
list_time = toc-tic

### Transfer data to GPU
print 'Transfer data to GPU'
コード例 #5
0
def calculateEsolv(surf_array, field_array, param, kernel):

    REAL = param.REAL

    par_reac = parameters()
    par_reac = param
    par_reac.threshold = 0.05
    par_reac.P = 7
    par_reac.theta = 0.0
    par_reac.Nm = (par_reac.P + 1) * (par_reac.P + 2) * (par_reac.P + 3) / 6

    ind_reac = index_constant()
    computeIndices(par_reac.P, ind_reac)
    precomputeTerms(par_reac.P, ind_reac)

    par_reac.Nk = 13  # Number of Gauss points per side for semi-analytical integrals

    cal2J = 4.184
    C0 = param.qe**2 * param.Na * 1e-3 * 1e10 / (cal2J * param.E_0)
    E_solv = []

    ff = -1
    for f in param.E_field:
        parent_type = surf_array[field_array[f].parent[0]].surf_type
        if parent_type != 'dirichlet_surface' and parent_type != 'neumann_surface':

            E_solv_aux = 0
            ff += 1
            print 'Calculating solvation energy for region %i, stored in E_solv[%i]' % (
                f, ff)

            AI_int = 0
            Naux = 0
            phi_reac = numpy.zeros(len(field_array[f].q))

            #           First look at CHILD surfaces
            #           Need to account for normals pointing outwards
            #           and E_hat coefficient (as region is outside and
            #           dphi_dn is defined inside)
            for i in field_array[f].child:
                s = surf_array[i]
                s.xk, s.wk = GQ_1D(par_reac.Nk)
                s.xk = REAL(s.xk)
                s.wk = REAL(s.wk)
                for C in range(len(s.tree)):
                    s.tree[C].M = numpy.zeros(par_reac.Nm)
                    s.tree[C].Md = numpy.zeros(par_reac.Nm)

                Naux += len(s.triangle)

                #               Coefficient to account for dphi_dn defined in
                #               interior but calculation done in exterior
                C1 = s.E_hat

                if param.GPU == 0:
                    phi_aux, AI = get_phir(s.phi, C1 * s.dphi, s,
                                           field_array[f].xq, s.tree, par_reac,
                                           ind_reac)
                elif param.GPU == 1:
                    phi_aux, AI = get_phir_gpu(s.phi, C1 * s.dphi, s,
                                               field_array[f], par_reac,
                                               kernel)

                AI_int += AI
                phi_reac -= phi_aux  # Minus sign to account for normal pointing out


#           Now look at PARENT surface
            if len(field_array[f].parent) > 0:
                i = field_array[f].parent[0]
                s = surf_array[i]
                s.xk, s.wk = GQ_1D(par_reac.Nk)
                s.xk = REAL(s.xk)
                s.wk = REAL(s.wk)
                for C in range(len(s.tree)):
                    s.tree[C].M = numpy.zeros(par_reac.Nm)
                    s.tree[C].Md = numpy.zeros(par_reac.Nm)

                Naux += len(s.triangle)

                if param.GPU == 0:
                    phi_aux, AI = get_phir(s.phi, s.dphi, s, field_array[f].xq,
                                           s.tree, par_reac, ind_reac)
                elif param.GPU == 1:
                    phi_aux, AI = get_phir_gpu(s.phi, s.dphi, s,
                                               field_array[f], par_reac,
                                               kernel)

                AI_int += AI
                phi_reac += phi_aux

            E_solv_aux += 0.5 * C0 * numpy.sum(field_array[f].q * phi_reac)
            E_solv.append(E_solv_aux)

            print '%i of %i analytical integrals for phi_reac calculation in region %i' % (
                AI_int / len(field_array[f].xq), Naux, f)

    return E_solv
コード例 #6
0
ファイル: matrixfree.py プロジェクト: LEONOB2014/pygbe
def calculateEsolv(surf_array, field_array, param, kernel):

    REAL = param.REAL

    par_reac = parameters()
    par_reac = param
    par_reac.threshold = 0.05
    par_reac.P = 7
    par_reac.theta = 0.0
    par_reac.Nm= (par_reac.P+1)*(par_reac.P+2)*(par_reac.P+3)/6

    ind_reac = index_constant()
    computeIndices(par_reac.P, ind_reac)
    precomputeTerms(par_reac.P, ind_reac)

    par_reac.Nk = 13         # Number of Gauss points per side for semi-analytical integrals

    cal2J = 4.184
    C0 = param.qe**2*param.Na*1e-3*1e10/(cal2J*param.E_0)
    E_solv = []

    ff = -1
    for f in param.E_field:
        parent_type = surf_array[field_array[f].parent[0]].surf_type
        if parent_type != 'dirichlet_surface' and parent_type != 'neumann_surface':

            E_solv_aux = 0
            ff += 1
            print 'Calculating solvation energy for region %i, stored in E_solv[%i]'%(f,ff)
            
            AI_int = 0
            Naux = 0
            phi_reac = zeros(len(field_array[f].q))

#           First look at CHILD surfaces
#           Need to account for normals pointing outwards
#           and E_hat coefficient (as region is outside and 
#           dphi_dn is defined inside)
            for i in field_array[f].child:
                s = surf_array[i]
                s.xk,s.wk = GQ_1D(par_reac.Nk)
                s.xk = REAL(s.xk)
                s.wk = REAL(s.wk)
                for C in range(len(s.tree)):
                    s.tree[C].M  = zeros(par_reac.Nm)
                    s.tree[C].Md = zeros(par_reac.Nm)

                Naux += len(s.triangle)

#               Coefficient to account for dphi_dn defined in
#               interior but calculation done in exterior
                C1 = s.E_hat

                if param.GPU==0:
                    phi_aux, AI = get_phir(s.phi, C1*s.dphi, s, field_array[f].xq, s.tree, par_reac, ind_reac)
                elif param.GPU==1:
                    phi_aux, AI = get_phir_gpu(s.phi, C1*s.dphi, s, field_array[f], par_reac, kernel)
                
                AI_int += AI
                phi_reac -= phi_aux # Minus sign to account for normal pointing out

#           Now look at PARENT surface
            if len(field_array[f].parent)>0:
                i = field_array[f].parent[0]
                s = surf_array[i]
                s.xk,s.wk = GQ_1D(par_reac.Nk)
                s.xk = REAL(s.xk)
                s.wk = REAL(s.wk)
                for C in range(len(s.tree)):
                    s.tree[C].M  = zeros(par_reac.Nm)
                    s.tree[C].Md = zeros(par_reac.Nm)

                Naux += len(s.triangle)

                if param.GPU==0:
                    phi_aux, AI = get_phir(s.phi, s.dphi, s, field_array[f].xq, s.tree, par_reac, ind_reac)
                elif param.GPU==1:
                    phi_aux, AI = get_phir_gpu(s.phi, s.dphi, s, field_array[f], par_reac, kernel)
                
                AI_int += AI
                phi_reac += phi_aux 

            
            E_solv_aux += 0.5*C0*sum(field_array[f].q*phi_reac)
            E_solv.append(E_solv_aux)

            print '%i of %i analytical integrals for phi_reac calculation in region %i'%(AI_int/len(field_array[f].xq),Naux, f)

    return E_solv