Changeset df776db in sasmodels for sasmodels/generate.py


Ignore:
Timestamp:
Jul 27, 2016 3:56:54 PM (8 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, costrafo411, magnetic_model, release_v0.94, release_v0.95, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
739aad4
Parents:
8357f66 (diff), 63c6a08 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'polydisp': adds magnetism; some models still broken

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/generate.py

    r562506e rdf776db  
    387387 
    388388 
    389 def kernel_name(model_info, is_2d): 
    390     # type: (ModelInfo, bool) -> str 
     389def kernel_name(model_info, variant): 
     390    # type: (ModelInfo, str) -> str 
    391391    """ 
    392392    Name of the exported kernel symbol. 
    393     """ 
    394     return model_info.name + "_" + ("Iqxy" if is_2d else "Iq") 
     393 
     394    *variant* is "Iq", "Iqxy" or "Imagnetic". 
     395    """ 
     396    return model_info.name + "_" + variant 
    395397 
    396398 
     
    485487    source.append(code) 
    486488 
    487  
    488489def make_source(model_info): 
    489     # type: (ModelInfo) -> str 
     490    # type: (ModelInfo) -> Dict[str, str] 
    490491    """ 
    491492    Generate the OpenCL/ctypes kernel from the module info. 
     
    539540 
    540541    # Define the parameter table 
     542    # TODO: plug in current line number 
     543    source.append('#line 542 "sasmodels/generate.py"') 
    541544    source.append("#define PARAMETER_TABLE \\") 
    542545    source.append("\\\n".join(p.as_definition() 
     
    556559    refs = ["_q[_i]"] + _call_pars("_v.", partable.iq_parameters) 
    557560    call_iq = "#define CALL_IQ(_q,_i,_v) Iq(%s)" % (",".join(refs)) 
    558     if _have_Iqxy(user_code): 
     561    if _have_Iqxy(user_code) or isinstance(model_info.Iqxy, str): 
    559562        # Call 2D model 
    560         refs = ["q[2*_i]", "q[2*_i+1]"] + _call_pars("_v.", partable.iqxy_parameters) 
     563        refs = ["_q[2*_i]", "_q[2*_i+1]"] + _call_pars("_v.", partable.iqxy_parameters) 
    561564        call_iqxy = "#define CALL_IQ(_q,_i,_v) Iqxy(%s)" % (",".join(refs)) 
    562565    else: 
    563566        # Call 1D model with sqrt(qx^2 + qy^2) 
    564         warnings.warn("Creating Iqxy = Iq(sqrt(qx^2 + qy^2))") 
     567        #warnings.warn("Creating Iqxy = Iq(sqrt(qx^2 + qy^2))") 
    565568        # still defined:: refs = ["q[i]"] + _call_pars("v", iq_parameters) 
    566569        pars_sqrt = ["sqrt(_q[2*_i]*_q[2*_i]+_q[2*_i+1]*_q[2*_i+1])"] + refs[1:] 
    567570        call_iqxy = "#define CALL_IQ(_q,_i,_v) Iq(%s)" % (",".join(pars_sqrt)) 
    568571 
     572    magpars = [k-2 for k,p in enumerate(partable.call_parameters) 
     573               if p.type == 'sld'] 
     574 
    569575    # Fill in definitions for numbers of parameters 
    570576    source.append("#define MAX_PD %s"%partable.max_pd) 
    571     source.append("#define NPARS %d"%partable.npars) 
     577    source.append("#define NUM_PARS %d"%partable.npars) 
     578    source.append("#define NUM_VALUES %d" % partable.nvalues) 
     579    source.append("#define NUM_MAGNETIC %d" % partable.nmagnetic) 
     580    source.append("#define MAGNETIC_PARS %s"%",".join(str(k) for k in magpars)) 
     581    for k,v in enumerate(magpars[:3]): 
     582        source.append("#define MAGNETIC_PAR%d %d"%(k+1, v)) 
    572583 
    573584    # TODO: allow mixed python/opencl kernels? 
    574585 
    575     source.append("#if defined(USE_OPENCL)") 
    576     source.extend(_add_kernels(ocl_code[0], call_iq, call_iqxy, model_info.name)) 
    577     source.append("#else /* !USE_OPENCL */") 
    578     source.extend(_add_kernels(dll_code[0], call_iq, call_iqxy, model_info.name)) 
    579     source.append("#endif /* !USE_OPENCL */") 
    580     return '\n'.join(source) 
    581  
    582  
    583 def _add_kernels(kernel_code, call_iq, call_iqxy, name): 
    584     # type: (str, str, str, str) -> List[str] 
    585     source = [ 
     586    ocl = kernels(ocl_code, call_iq, call_iqxy, model_info.name) 
     587    dll = kernels(dll_code, call_iq, call_iqxy, model_info.name) 
     588    result = { 
     589        'dll': '\n'.join(source+dll[0]+dll[1]+dll[2]), 
     590        'opencl': '\n'.join(source+ocl[0]+ocl[1]+ocl[2]), 
     591    } 
     592 
     593    return result 
     594 
     595 
     596def kernels(kernel, call_iq, call_iqxy, name): 
     597    # type: ([str,str], str, str, str) -> List[str] 
     598    code = kernel[0] 
     599    path = kernel[1].replace('\\', '\\\\') 
     600    iq = [ 
    586601        # define the Iq kernel 
    587         "#define KERNEL_NAME %s_Iq"%name, 
     602        "#define KERNEL_NAME %s_Iq" % name, 
    588603        call_iq, 
    589         kernel_code, 
     604        '#line 1 "%s Iq"' % path, 
     605        code, 
    590606        "#undef CALL_IQ", 
    591607        "#undef KERNEL_NAME", 
    592  
     608        ] 
     609 
     610    iqxy = [ 
    593611        # define the Iqxy kernel from the same source with different #defines 
    594         "#define KERNEL_NAME %s_Iqxy"%name, 
     612        "#define KERNEL_NAME %s_Iqxy" % name, 
    595613        call_iqxy, 
    596         kernel_code, 
     614        '#line 1 "%s Iqxy"' % path, 
     615        code, 
     616        "#undef CALL_IQ", 
     617        "#undef KERNEL_NAME", 
     618         ] 
     619 
     620    imagnetic = [ 
     621        # define the Imagnetic kernel 
     622        "#define KERNEL_NAME %s_Imagnetic" % name, 
     623        "#define MAGNETIC 1", 
     624        call_iqxy, 
     625        '#line 1 "%s Imagnetic"' % path, 
     626        code, 
     627        "#undef MAGNETIC", 
    597628        "#undef CALL_IQ", 
    598629        "#undef KERNEL_NAME", 
    599630    ] 
    600     return source 
     631 
     632    return iq, iqxy, imagnetic 
    601633 
    602634 
     
    712744        model_info = make_model_info(kernel_module) 
    713745        source = make_source(model_info) 
    714         print(source) 
     746        print(source['dll']) 
    715747 
    716748 
Note: See TracChangeset for help on using the changeset viewer.