Changeset e44432d in sasmodels for sasmodels/generate.py


Ignore:
Timestamp:
Oct 19, 2018 5:46:26 PM (6 years ago)
Author:
Paul Kienzle <pkienzle@…>
Branches:
master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
Children:
be43e39
Parents:
2586ab72
Message:

support hollow models in structure factor calculations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sasmodels/generate.py

    r2773c66 re44432d  
    715715    return False 
    716716 
     717_SHELL_VOLUME_PATTERN = re.compile(r"(^|\s)double\s+shell_volume[(]", flags=re.MULTILINE) 
     718def contains_shell_volume(source): 
     719    # type: (List[str]) -> bool 
     720    """ 
     721    Return True if C source defines "void Fq(". 
     722    """ 
     723    for code in source: 
     724        m = _SHELL_VOLUME_PATTERN.search(code) 
     725        if m is not None: 
     726            return True 
     727    return False 
     728 
    717729def _add_source(source, code, path, lineno=1): 
    718730    """ 
     
    767779        pars = partable.form_volume_parameters 
    768780        source.append(_gen_fn(model_info, 'form_volume', pars)) 
     781    if isinstance(model_info.shell_volume, str): 
     782        pars = partable.form_volume_parameters 
     783        source.append(_gen_fn(model_info, 'shell_volume', pars)) 
    769784    if isinstance(model_info.Iq, str): 
    770785        pars = [q] + partable.iq_parameters 
     
    779794        pars = [qa, qb, qc] + partable.iq_parameters 
    780795        source.append(_gen_fn(model_info, 'Iqabc', pars)) 
     796 
     797    # Check for shell_volume in source 
     798    is_hollow = contains_shell_volume(source) 
    781799 
    782800    # What kind of 2D model do we need?  Is it consistent with the parameters? 
     
    802820                              for p in partable.kernel_parameters)) 
    803821    # Define the function calls 
    804     call_effective_radius = "#define CALL_EFFECTIVE_RADIUS(mode, v) 0.0" 
     822    call_effective_radius = "#define CALL_EFFECTIVE_RADIUS(_mode, _v) 0.0" 
    805823    if partable.form_volume_parameters: 
    806824        refs = _call_pars("_v.", partable.form_volume_parameters) 
    807         call_volume = "#define CALL_VOLUME(_v) form_volume(%s)"%(",".join(refs)) 
     825        if is_hollow: 
     826            call_volume = "#define CALL_VOLUME(_form, _shell, _v) do { _form = form_volume(%s); _shell = shell_volume(%s); } while (0)"%((",".join(refs),)*2) 
     827        else: 
     828            call_volume = "#define CALL_VOLUME(_form, _shell, _v) do { _form = _shell = form_volume(%s); } while (0)"%(",".join(refs)) 
    808829        if model_info.effective_radius_type: 
    809             call_effective_radius = "#define CALL_EFFECTIVE_RADIUS(mode, _v) effective_radius(mode, %s)"%(",".join(refs)) 
     830            call_effective_radius = "#define CALL_EFFECTIVE_RADIUS(_mode, _v) effective_radius(_mode, %s)"%(",".join(refs)) 
    810831    else: 
    811832        # Model doesn't have volume.  We could make the kernel run a little 
    812833        # faster by not using/transferring the volume normalizations, but 
    813834        # the ifdef's reduce readability more than is worthwhile. 
    814         call_volume = "#define CALL_VOLUME(v) 1.0" 
     835        call_volume = "#define CALL_VOLUME(_form, _shell, _v) do { _form = _shell = 1.0; } while (0)" 
    815836    source.append(call_volume) 
    816837    source.append(call_effective_radius) 
Note: See TracChangeset for help on using the changeset viewer.