Changeset 417


Ignore:
Timestamp:
Nov 16, 2011 2:42:49 PM (10 years ago)
Author:
toby
Message:

compute derivs for constrained vars

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/GSASIImapvars.py

    r415 r417  
    430430    return msg
    431431
     432def GetDependentVars():
     433    '''Return a list of dependent variables: e.g. variables that are
     434    constrained in terms of other variables'''
     435    dependentVars = []
     436    global dependentParmList
     437    for lst in dependentParmList:
     438        for itm in lst: dependentVars.append(itm)
     439    return dependentVars
    432440
    433441def VarRemapShow(varyList):
     
    442450    s += 'Variable mapping relations:\n'
    443451    global dependentParmList,arrayList,invarrayList,indParmList,fixedDict
    444     for varlist,mapvars,multarr in zip(dependentParmList,indParmList,arrayList):
     452    for varlist,mapvars,multarr,invmultarr in zip(
     453        dependentParmList,indParmList,arrayList,invarrayList):
    445454        i = 0
    446455        for mv in mapvars:
     
    448457                s += '  ' + str(mv) + ' defines parameter(s): '
    449458                j = 0
    450                 for v in varlist:
     459                for v,m in zip(varlist,invmultarr):
     460                    print v,m[0]
    451461                    if j > 0: s += '  & '
    452462                    j += 1
    453463                    s += str(v)
     464                    if m != 1:
     465                        s += " / " + str(m[0])                       
    454466                s += '\n'
    455467                continue
     
    478490            i += 1
    479491    return s
     492
     493def Dict2Deriv(varyList,derivDict,dMdv):
     494    '''Compute derivatives for Independent Parameters from the
     495    derivatives for the original parameters
     496    '''
     497    global dependentParmList,arrayList,invarrayList,indParmList,invarrayList
     498    for varlist,mapvars,multarr,invmultarr in zip(
     499        dependentParmList,indParmList,arrayList,invarrayList):
     500        for i,name in enumerate(mapvars):
     501            if name not in varyList: continue # if independent var not varied
     502            if multarr is None:
     503                # grouped variables need to add in the derv. w/r
     504                # dependent variables to the dependent ones
     505                for v,m in zip(varlist,invmultarr):
     506                    print 'add derv',v,'/',m[0],'to derv',name
     507                    if m[0] != 1 and m[0] != 0:
     508                        dMdv[varyList.index(name)] += derivDict[v]/m[0]
     509            else:
     510                for m,v in zip(multarr[i,:],varlist):
     511                    print 'add',m,' * derv',v,'to derv',name
     512                    dMdv[varyList.index(name)] += m * derivDict[v]
    480513
    481514def Map2Dict(parmDict,varyList):
     
    701734    StoreEquivalence('2::atomx:3',('2::atomy:3', ('2::atomz:3',2,), ))
    702735    varylist = ['2::atomx:3',]
    703     print VarRemapShow(varylist)
    704     msg = SetVaryFlags(varylist)
    705     if msg != "": print msg
     736    #print VarRemapShow(varylist)
     737    #msg = SetVaryFlags(varylist)
     738    #if msg != "": print msg
    706739    varylist = ['2::atomx:3', '2::atomy:3', '2::atomz:3',]
    707740    print VarRemapShow(varylist)
  • trunk/GSASIIstruct.py

    r415 r417  
    22372237        elif SGData['SGLaue'] in ['m3m','m3']:
    22382238            return [[pfx+'A0',dpdA[0]+dpdA[1]+dpdA[2]]]
    2239    
     2239    # create a list of dependent variables and set up a dictionary to hold their derivatives
     2240    dependentVars = G2mv.GetDependentVars()
     2241    depDerivDict = {}
     2242    for j in dependentVars:
     2243        depDerivDict[j] = np.zeros(shape=(len(x)))
     2244    #print 'dependent vars',dependentVars
    22402245    lenX = len(x)               
    22412246    hId = Histogram['hId']
     
    22432248    bakType = calcControls[hfx+'bakType']
    22442249    dMdv = np.zeros(shape=(len(varylist),len(x)))
    2245     if hfx+'Back:0' in varylist:
     2250    if hfx+'Back:0' in varylist: # for now assume that Back:x vars to not appear in constraints
    22462251        dMdb = G2pwd.getBackgroundDerv(hfx,parmDict,bakType,x)
    22472252        bBpos =varylist.index(hfx+'Back:0')
     
    23182323                        idx = varylist.index(pfx+'PWLref:'+str(pawleyLookup[pfx+'%d,%d,%d'%(h,k,l)]))
    23192324                        dMdv[idx] = dervDict['int']/refl[9]
     2325                        # Assuming Pawley variables not in constraints
    23202326                    except ValueError:
    23212327                        pass
     
    23312337                        item = names[name]
    23322338                        dMdv[varylist.index(name)] += item[0]*dervDict[item[1]]
     2339                    if name in dependentVars:
     2340                        depDerivDict[name] += item[0]*dervDict[item[1]]
     2341
    23332342                for iPO in dIdPO:
    23342343                    if iPO in varylist:
    23352344                        dMdv[varylist.index(iPO)] += dIdPO[iPO]*dervDict['int']
     2345                    if iPO in dependentVars:
     2346                        depDerivDict[iPO] = dIdPO[iPO]*dervDict['int']
     2347
    23362348                for i,name in enumerate(['omega','chi','phi']):
    23372349                    aname = pfx+'SH '+name
    23382350                    if aname in varylist:
    23392351                        dMdv[varylist.index(aname)] += dFdSA[i]*dervDict['int']
     2352                    if aname in dependentVars:
     2353                        depDerivDict[aname] += dFdSA[i]*dervDict['int']
    23402354                for iSH in dFdODF:
    23412355                    if iSH in varylist:
    23422356                        dMdv[varylist.index(iSH)] += dFdODF[iSH]*dervDict['int']
     2357                    if iSH in dependentVars:
     2358                        depDerivDict[iSH] += dFdODF[iSH]*dervDict['int']
    23432359                cellDervNames = cellVaryDerv(pfx,SGData,dpdA)
    23442360                for name,dpdA in cellDervNames:
    23452361                    if name in varylist:
    23462362                        dMdv[varylist.index(name)] += dpdA*dervDict['pos']
     2363                    if name in dependentVars:
     2364                        depDerivDict[name] += dpdA*dervDict['pos']
    23472365                dDijDict = GetHStrainShiftDerv(refl,SGData,phfx)
    23482366                for name in dDijDict:
    23492367                    if name in varylist:
    23502368                        dMdv[varylist.index(name)] += dDijDict[name]*dervDict['pos']
     2369                    if name in dependentVars:
     2370                        depDerivDict[name] += dDijDict[name]*dervDict['pos']
    23512371                gamDict = GetSampleGamDerv(refl,wave,G,phfx,calcControls,parmDict,sizeEllipse)
    23522372                for name in gamDict:
    23532373                    if name in varylist:
    23542374                        dMdv[varylist.index(name)] += gamDict[name]*dervDict['gam']
     2375                    if name in dependentVars:
     2376                        depDerivDict[name] += gamDict[name]*dervDict['gam']
    23552377                                               
    23562378            elif 'T' in calcControls[hfx+'histType']:
    23572379                print 'TOF Undefined at present'
    23582380                raise Exception    #no TOF yet
    2359 #do atom derivatives -  for F,X & U so far             
     2381            #do atom derivatives -  for F,X & U so far             
    23602382            corr = dervDict['int']/refl[9]
    2361             for name in varylist:
     2383            for name in varylist+dependentVars:
    23622384                try:
    23632385                    aname = name.split(pfx)[1][:2]
    2364                     if aname in ['Af','dA','AU']:
    2365                          dMdv[varylist.index(name)] += dFdvDict[name][iref]*corr
     2386                    if aname not in ['Af','dA','AU']: continue # skip anything not an atom param
    23662387                except IndexError:
    2367                     pass
     2388                    continue
     2389                if name in varylist:
     2390                    dMdv[varylist.index(name)] += dFdvDict[name][iref]*corr
     2391                if name in dependentVars:
     2392                    depDerivDict[name] += dFdvDict[name][iref]*corr
     2393    # now process derivatives in constraints
     2394    G2mv.Dict2Deriv(varylist,depDerivDict,dMdv)
    23682395    return dMdv
    23692396
Note: See TracChangeset for help on using the changeset viewer.