⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsc.pro

📁 basic median filter simulation
💻 PRO
📖 第 1 页 / 共 2 页
字号:
FUNCTION tsc,value,posx,nx,posy,ny,posz,nz, $             AVERAGE=average,WRAPAROUND=wraparound,NO_MESSAGE=no_message, $             ISOLATED=isolated;+; NAME:;       TSC;; PURPOSE:;       Interpolate an irregularly sampled field using a Triangular Shaped Cloud;; EXPLANATION:;       This function interpolates an irregularly sampled field to a;       regular grid using Triangular Shaped Cloud (nearest grid point;       gets weight 0.75-dx^2, points before and after nearest grid;       points get weight 0.5*(1.5-dx)^2, where dx is the distance;       from the sample to the grid point in units of the cell size).;; CATEGORY:;       Mathematical functions, Interpolation;; CALLING SEQUENCE:;       Result = TSC, VALUE, POSX, NX[, POSY, NY, POSZ, NZ, ;                     AVERAGE = average, WRAPAROUND =  wraparound,;                     ISOLATED = isolated, NO_MESSAGE = no_message];; INPUTS:;       VALUE: Array of sample weights (field values). For e.g. a;              temperature field this would be the temperature and the;              keyword AVERAGE should be set. For e.g. a density field;              this could be either the particle mass (AVERAGE should;              not be set) or the density (AVERAGE should be set).;       POSX:  Array of X coordinates of field samples, unit indices: [0,NX>.;       NX:    Desired number of grid points in X-direction.;       ; OPTIONAL INPUTS:;      POSY: Array of Y coordinates of field samples, unit indices: [0,NY>.;      NY:   Desired number of grid points in Y-direction.;      POSZ: Array of Z coordinates of field samples, unit indices: [0,NZ>.;      NZ:   Desired number of grid points in Z-direction.;; KEYWORD PARAMETERS:;       AVERAGE:    Set this keyword if the nodes contain field samples;                   (e.g. a temperature field). The value at each grid;                   point will then be the weighted average of all the;                   samples allocated to it. If this keyword is not;                   set, the value at each grid point will be the;                   weighted sum of all the nodes allocated to it;                   (e.g. for a density field from a distribution of;                   particles). (D=0). ;       WRAPAROUND: Set this keyword if you want the first grid point;                   to contain samples of both sides of the volume;                   (see below).;       ISOLATED:   Set this keyword if the data is isolated, i.e. not;                   periodic. In that case total `mass' is not conserved.;                   This keyword cannot be used in combination with the;                   keyword WRAPAROUND.;       NO_MESSAGE: Suppress informational messages.;; Example of default allocation of nearest grid points: n0=4, *=gridpoint.;;     0   1   2   3     Index of gridpoints;     *   *   *   *     Grid points;   |---|---|---|---|   Range allocated to gridpoints ([0.0,1.0> --> 0, etc.);   0   1   2   3   4   posx;; Example of ngp allocation for WRAPAROUND: n0=4, *=gridpoint.;;   0   1   2   3         Index of gridpoints;   *   *   *   *         Grid points; |---|---|---|---|--     Range allocated to gridpoints ([0.5,1.5> --> 1, etc.);   0   1   2   3   4=0   posx;;; OUTPUTS:;       Prints that a TSC interpolation is being performed of x;       samples to y grid points, unless NO_MESSAGE is set.;; RESTRICTIONS:;       Field data is assumed to be periodic with the sampled volume;       the basic cell, unless ISOLATED is set.;       All input arrays must have the same dimensions.;       Postition coordinates should be in `index units' of the;       desired grid: POSX=[0,NX>, etc.;       Keywords ISOLATED and WRAPAROUND cannot both be set.;; PROCEDURE:;       Nearest grid point is determined for each sample.;       TSC weights are computed for each sample.;       Samples are interpolated to the grid.;       Grid point values are computed (sum or average of samples).;; EXAMPLE:;       nx=20;       ny=10;       posx=randomu(s,1000);       posy=randomu(s,1000);       value=posx^2+posy^2;       field=tsc(value,posx*nx,nx,posy*ny,ny,/average);       surface,field,/lego;; NOTES:;       Use csc.pro or ngp.pro for lower order interpolation schemes.    A ;       standard reference for these interpolation methods is:   R.W. Hockney ;       and J.W. Eastwood, Computer Simulations Using Particles (New York: ;       McGraw-Hill, 1981).;; MODIFICATION HISTORY:;       Written by Joop Schaye, Feb 1999.;       Check for overflow for large dimensions  P. Riley/W. Landsman Dec. 1999;-nrsamples=n_elements(value)nparams=n_params()dim=(nparams-1)/2IF dim LE 2 THEN BEGIN    nz=1    IF dim EQ 1 THEN ny=1ENDIFnxny=long(nx)*long(ny);---------------------; Some error handling.;---------------------on_error,2  ; Return to caller if an error occurs.IF NOT (nparams EQ 3 OR nparams EQ 5 OR nparams EQ 7) THEN BEGIN    message,'Incorrect number of arguments!',/continue    message,'Syntax: TSC, VALUE, POSX, NX[, POSY, NY, POSZ, NZ,' + $      ' AVERAGE = average, WRAPAROUND =  wraparound]'ENDIF IF (nrsamples NE n_elements(posx)) OR $  (dim GE 2 AND nrsamples NE n_elements(posy)) OR $  (dim EQ 3 AND nrsamples NE n_elements(posz)) THEN $  message,'Input arrays must have the same dimensions!'IF keyword_set(isolated) AND keyword_set(wraparound) THEN $  message,'Keywords ISOLATED and WRAPAROUND cannot both be set!'IF NOT keyword_set(no_message) THEN $  print,'Interpolating ' + strtrim(string(nrsamples,format='(i10)'),1) $  + ' samples to ' + strtrim(string(nxny*nz,format='(i10)'),1) + $  ' grid points using TSC...';-----------------------; Calculate TSC weights.;-----------------------; Compute weights per axis, in order to reduce memory (everything; needs to be in memory if we compute all nearest grid points first).;*************; X-direction.;*************; Coordinates of nearest grid point (ngp).IF keyword_set(wraparound) THEN ngx=fix(posx+0.5) $ELSE ngx=fix(posx)+0.5; Distance from sample to ngp.dngx=ngx-posx; Index of ngp.IF keyword_set(wraparound) THEN kx2=temporary(ngx) $ELSE kx2=temporary(ngx)-0.5; Weight of ngp.wx2=0.75-dngx*dngx; Point before ngp.kx1=kx2-1  ; Index.dx=1.0-dngx  ; Distance to sample.wx1=0.5*(1.5-temporary(dx))^2  ; TSC-weight.; Point after ngp.kx3=kx2+1  ; Index.dx=1.0+temporary(dngx)  ; Distance to sample.wx3=0.5*(1.5-temporary(dx))^2  ; TSC-weight.; Periodic boundary conditions.bad=where(kx2 EQ 0,count)IF count NE 0 THEN BEGIN       ; Otherwise kx1=-1.    kx1[bad]=nx-1    IF keyword_set(isolated) THEN wx1[bad]=0.ENDIFbad=where(kx2 EQ nx-1,count)IF count NE 0 THEN BEGIN       ; Otherwise kx3=nx.    kx3[bad]=0    IF keyword_set(isolated) THEN wx3[bad]=0.ENDIFIF keyword_set(wraparound) THEN BEGIN    bad=where(kx2 EQ nx,count)    IF count NE 0 THEN BEGIN        kx2[bad]=0        kx3[bad]=1    ENDIFENDIFbad=0  ; Free memory.;*************; Y-direction.;*************IF dim GE 2 THEN BEGIN     ; Coordinates of nearest grid point (ngp).    IF keyword_set(wraparound) THEN ngy=fix(posy+0.5) $    ELSE ngy=fix(posy)+0.5    ; Distance from sample to ngp.    dngy=ngy-posy    ; Index of ngp.    IF keyword_set(wraparound) THEN ky2=temporary(ngy) $    ELSE ky2=temporary(ngy)-0.5    ; Weight of ngp.    wy2=0.75-dngy*dngy    ; Point before ngp.    ky1=ky2-1  ; Index.    dy=1.0-dngy  ; Distance to sample.    wy1=0.5*(1.5-temporary(dy))^2  ; TSC-weight.    ; Point after ngp.    ky3=ky2+1  ; Index.    dy=1.0+temporary(dngy)  ; Distance to sample.    wy3=0.5*(1.5-temporary(dy))^2  ; TSC-weight.    ; Periodic boundary conditions.    bad=where(ky2 EQ 0,count)    IF count NE 0 THEN BEGIN       ; Otherwise ky1=-1.        ky1[bad]=ny-1        IF keyword_set(isolated) THEN wy1[bad]=0.    ENDIF    bad=where(ky2 EQ ny-1,count)    IF count NE 0 THEN BEGIN       ; Otherwise ky3=ny.        ky3[bad]=0        IF keyword_set(isolated) THEN wy3[bad]=0.    ENDIF    IF keyword_set(wraparound) THEN BEGIN        bad=where(ky2 EQ ny,count)        IF count NE 0 THEN BEGIN            ky2[bad]=0            ky3[bad]=1        ENDIF    ENDIF    bad=0  ; Free memory.ENDIF ELSE BEGIN    ky1=0    ky2=0    wy1=1    wy2=1ENDELSE;*************; Z-direction.;*************IF dim EQ 3 THEN BEGIN    ; Coordinates of nearest grid point (ngp).    IF keyword_set(wraparound) THEN ngz=fix(posz+0.5) $    ELSE ngz=fix(posz)+0.5    ; Distance from sample to ngp.    dngz=ngz-posz    ; Index of ngp.    IF keyword_set(wraparound) THEN kz2=temporary(ngz) $    ELSE kz2=temporary(ngz)-0.5    ; Weight of ngp.    wz2=0.75-dngz*dngz    ; Point before ngp.    kz1=kz2-1  ; Index.    dz=1.0-dngz  ; Distance to sample.    wz1=0.5*(1.5-temporary(dz))^2  ; TSC-weight.    ; Point after ngp.    kz3=kz2+1  ; Index.    dz=1.0+temporary(dngz)  ; Distance to sample.    wz3=0.5*(1.5-temporary(dz))^2  ; TSC-weight.    ; Periodic boundary conditions.    bad=where(kz2 EQ 0,count)    IF count NE 0 THEN BEGIN       ; Otherwise kz1=-1.        kz1[bad]=nz-1        IF keyword_set(isolated) THEN wz1[bad]=0.    ENDIF    bad=where(kz2 EQ nz-1,count)    IF count NE 0 THEN BEGIN       ; Otherwise kz3=nz.        kz3[bad]=0        IF keyword_set(isolated) THEN wz3[bad]=0.    ENDIF    IF keyword_set(wraparound) THEN BEGIN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -