text:
Fortran 2008 Overview
Fortran 2008 Overview
Table of Contents
- 1 Introduction
- 2 Overview of Fortran 2008
3 SPMD programming with coarrays [6.2]
- 3.1 Overview
- 3.2 Images
- 3.3 Coarrays
- 3.4 Declaring coarrays
- 3.5 Accessing coarrays on other images
- 3.6 Segments and synchronisation
- 3.7 Allocating and deallocating coarrays
- 3.8 Critical constructs
- 3.9 Lock variables
- 3.10 Atomic coarray accessing
- 3.11 Normal termination of execution
- 3.12 Error termination
- 3.13 Fault tolerance
- 3.14 Detailed syntax of coarray features
- 3.15 Intrinsic procedures and coarrays
- 4 Data declaration [mostly 6.0]
- 5 Data usage and computation [mostly 5.3]
- 6 Execution control [mostly 6.0]
7 Intrinsic procedures and modules
- 7.1 Additional mathematical intrinsic functions [mostly 5.3.1]
- 7.2 Additional intrinsic functions for bit manipulation [mostly 5.3]
- 7.3 Other new intrinsic procedures [mostly 5.3.1]
- 7.4 Changes to existing intrinsic procedures [mostly 5.3.1]
- 7.5 ISO_C_BINDING additions [6.2]
- 7.6 ISO_FORTRAN_ENV additions
- 8 Input/output extensions [mostly 5.3]
- 9 Programs and procedures [mostly 5.3]
- 10 References
1 Introduction
This document describes those parts of the Fortran 2008 language which are not in Fortran 2003, and which are supported by the latest release of the NAG Fortran Compiler.
The compiler release in which a feature was made available is indicated by square brackets; for example, a feature marked as '[5.3]' was first available in Release 5.3.
2 Overview of Fortran 2008
The new features of Fortran 2008 that are supported by the NAG Fortran Compiler can be grouped as follows:
- SPMD programming with coarrays;
- data declaration;
- data usage and computation;
- execution control;
- intrinsic procedures and modules;
- input/output extensions;
- programs and procedures.
3 SPMD programming with coarrays [6.2]
3.1 OverviewFortran 2008 contains an SPMD (Single Program Multiple Data) programming model, where multiple copies of a program, called "images", are executed in parallel. Special variables called "coarrays" facilitate communication between images.
Release 6.2 of the NAG Fortran Compiler limits execution to a single image, i.e. there is no parallel execution. Coarray programs that require multiple images to operate correctly cannot be executed successfully in this release.
3.2 ImagesEach image contains its own variables and input/output units. The number of images at execution time is not determined by the program, but by some compiler-specific method. The number of images is fixed during execution; images cannot be created or destroyed. The intrinsic function NUM_IMAGES() returns the number of images. Each image has an "image index"; this is a positive integer from 1 to the number of images. The intrinsic function THIS_IMAGE() returns the image index of the executing image.
3.3 CoarraysCoarrays are variables that can be directly accessed by another image; they must have the ALLOCATABLE or SAVE attribute or be a dummy argument.
A coarray has a "corank", which is the number of "codimensions" it has. Each codimension has a lower "cobound" and an upper cobound, determining the "coshape". The upper cobound of the last codimension is "*"; rather like an assumed-size array. The "cosubscripts" determine the image index of the reference, in the same way that the subscripts of an array determine the array element number. Again, like an assumed-size array, the image index must be less than or equal to the number of images.
A coarray can be a scalar or an array. It cannot have the POINTER attribute, but it can have pointer components.
As well as variables, coarray components are possible. In this case, the component must be an ALLOCATABLE coarray, and any variable with such a component must be a dummy argument or have the SAVE attribute.
3.4 Declaring coarraysA coarray has a coarray-spec which is declared with square brackets after the variable name, or with the CODIMENSION attribute or statement. For example,
REAL a[100,*] REAL,CODIMENSION[-10:10,-10:*] :: b CODIMENSION c[*]declares the coarray A to have corank 2 with lower "cobounds" both 1 and the first upper cobound 100, the coarray B to have corank 2 with lower cobounds both −10 and the first upper cobound 10, and the coarray C to have corank 1 and lower cobound 1. Note that for non-allocatable coarrays, the coarray-spec must always declare the last upper cobound with an asterisk, as this will vary depending on the number of images.
An ALLOCATABLE coarray is declared with a deferred-coshape-spec, for example,
REAL,ALLOCATABLE :: d[:,:,:,:]declares the coarray D to have corank 4.
3.5 Accessing coarrays on other imagesTo access another image's copy of a coarray, cosubscripts are used following the coarray name in square brackets; this is called "coindexing", and such an object is a "coindexed object". For example, given
REAL,SAVE :: e[*]the coindexed object e[1] refers to the copy of E on image 1, and e[13] refers to the copy of E on image 13. For a more complicated example: given
REAL,SAVE :: f[10,21:30,0:*]the reference f[3,22,1] refers to the copy of F on image 113. There is no correlation between image numbers and any topology of the computer, so it is probably best to avoid complicated codimensions, especially if different coarrays have different coshape.
When a coarray is an array, you cannot put the cosubscripts directly after the array name, but must use array section notation instead. For example, with
REAL,SAVE :: g(10,10)[*]the reference g[inum] is invalid, to refer to the whole array G on image INUM you need to use g(:,:)[inum] instead.
Similarly, to access a single element of G, the cosubscripts follow the subscripts, e.g. g(i,j)[inum].
Finally, note that when a coarray is accessed, whether by its own image or remotely, the segment ordering rules (see next section) must be obeyed. This is to avoid nonsense answers from data races.
3.6 Segments and synchronisationExecution on each image is divided into segments, by "image control statements". The segments on a single image are ordered: each segment follows the preceding segment. Segments on different images may be ordered (one following the other) by synchronisation, otherwise they are unordered.
If a coarray is defined (assigned a value) in a segment on image I, another image J is only allowed to reference or define it in a segment that follows the segment on I.
The image control statements, and their synchronisation effects, are as follows.
- synchronises with corresponding SYNC ALL statement executions on other images; the segment following the nth execution of a SYNC ALL statement on one image follows all the segments that preceded the nth execution of a SYNC ALL statement on every other image.
- SYNC IMAGES (list)
- synchronises with corresponding SYNC IMAGES statement executions on the images in list, which is an integer expression that may be scalar or a vector. Including the invoking image number in list has no effect. The segment following the nth execution of a SYNC IMAGES statement on image I with the image number J in its list follows the segments on image J before its nth execution of SYNC IMAGES with I in its list.
- is equivalent to SYNC IMAGES with every image no. in its list, e.g. SYNC IMAGES ([(i,i=1,NUM_IMAGES())]).
- This only acts as a segment divider, without synchronising with any other image. It may be useful for user-defined orderings when some other mechanism has been used to synchronise.
- ALLOCATE or DEALLOCATE
- with a coarray object being allocated or deallocated. This synchronises all images, which must execute the same ALLOCATE or DEALLOCATE statement.
- CRITICAL and END CRITICAL
- Only one image can execute a CRITICAL construct at a time. The code inside a CRITICAL construct forms a segment, which follows the previous execution (on whatever image) of the CRITICAL construct.
- LOCK and UNLOCK
- The segment following a LOCK statements that locks a particular lock variable follows the UNLOCK statement that previously unlocked the variable.
- END statement
- An END BLOCK, END FUNCTION, or END SUBROUTINE statement that causes automatic deallocation of a local ALLOCATABLE coarray, synchronises with all images (which must execute the same END statement).
- MOVE_ALLOC intrinsic
- Execution of the intrinsic subroutine MOVE_ALLOC with coarray arguments synchronises all images, which must execute the same CALL statement.
Note that image control statements have side-effects, and therefore are not permitted in pure procedures or within DO CONCURRENT constructs.
3.7 Allocating and deallocating coarraysWhen you allocate an ALLOCATABLE coarray, you must give the desired cobounds in the ALLOCATE statement. For example,
REAL,ALLOCATABLE :: x(:,:,:)[:,:] ... ALLOCATE(x(100,100,3)[1:10,*])Note that the last upper cobound must be an asterisk, the same as when declaring an explicit-coshape coarray.
When allocating a coarray there is a synchronisation: all images must execute the same ALLOCATE statement, and all the bounds, type parameters, and cobounds of the coarray must be the same on all images.
Similarly, there is a synchronisation when a coarray is deallocated, whether by a DEALLOCATE statement or automatic deallocation by an END statement; every image must execute the same statement.
Note that the usual automatic reallocation of allocatable variables in an intrinsic assignment statement, e.g. when the expression is an array of a different shape, is not available for coarrays. An allocatable coarray variable being assigned to must already be allocated and be conformable with the expression; furthermore, if it has deferred type parameters they must have the same values, and if it is polymorphic it must have the same dynamic type.
3.8 Critical constructsThe CRITICAL construct provides a mechanism for ensuring that only one image at a time executes a code segment. For example,
CRITICAL ...do something END CRITICALIf an image I arrives at the CRITICAL statement while another image J is executing the block of the construct, it will wait until image J has executed the END CRITICAL statement before continuing. Thus the CRITICAL — END CRITICAL segment on image I follows the equivalent segment on image J.
As a construct, this may have a name, e.g.
critsec: CRITICAL ... END CRITICAL critsecThe name has no effect on the operation of the construct. Each CRITICAL construct is separate from all others, and has no effect on their execution.
3.9 Lock variablesA "lock variable" is a variable of the type LOCK_TYPE, defined in the intrinsic module ISO_FORTRAN_ENV. A lock variable must be a coarray, or a component of a coarray. It is initially "unlocked"; it is locked by execution of a LOCK statement, and unlocked by execution of an UNLOCK statement. Apart from those statements, it cannot appear in any variable definition context, other than as the actual argument for an INTENT(INOUT) dummy argument.
Execution of the segment after a LOCK statement successfully locks the variable follows execution of the segment before the UNLOCK statement on the image that unlocked it. For example,
INTEGER FUNCTION get_sequence_number() USE iso_fortran_env INTEGER :: number = 0 TYPE(lock_type) lock[*] LOCK(lock[1]) number = number + 1 get_sequence_number = number UNLOCK(lock[1]) END FUNCTIONIf the variable lock on image 1 is locked when the LOCK statement is executed, it will wait for it to become unlocked before continuing. Thus the function get_sequence_number() provides an one-sided ordering relation: the segment following a call that returned the value N will follow every segment that preceded a call that returned a value less than N.
Conditional locking is provided with the ACQUIRED_LOCK= specifier; if this specifier is present, the executing image only acquires the lock if it was previously unlocked. For example,
LOGICAL gotit LOCK(lock[1],ACQUIRED_LOCK=gotit) IF (gotit) THEN ! We have the lock. ELSE ! We do not have the lock - some other image does. END IF
It is an error for an image to try to LOCK a variable that is already locked to that image, or to UNLOCK a variable that is already unlocked, or that is locked to another image. If the STAT= specifier is used, these errors will return the values STAT_LOCKED, STAT_UNLOCKED, or STAT_LOCKED_OTHER_IMAGE respectively (these named constants are provided by the intrinsic module ISO_FORTRAN_ENV).
3.10 Atomic coarray accessingAs an exception to the segment ordering rules, a coarray that is an integer of kind ATOMIC_INT_KIND or a logical of kind ATOMIC_LOGICAL_KIND (these named constants are provided by the intrinsic module ISO_FORTRAN_ENV), can be defined with the intrinsic subroutine ATOMIC_DEFINE, or referenced by the intrinsic subroutine ATOMIC_REF. For example,
MODULE stopping USE iso_fortran_env LOGICAL(atomic_logical_kind),PRIVATE :: stop_flag[*] = .FALSE. CONTAINS SUBROUTINE make_it_stop CALL atomic_define(stop_flag[1],.TRUE._atomic_logical_kind) END SUBROUTINE LOGICAL FUNCTION please_stop() CALL atomic_ref(please_stop,stop_flag[1]) END FUNCTION END MODULEIn this example, it is perfectly valid for any image to call make_it_stop, and for any other image to invoke the function please_stop(), without any regard for segments. (On a distributed memory machine it might take some time for changes to the atomic variable to be visible on other images, but they should eventually get the message.)
Note that ordinary assignment and referencing should not be mixed with calls to the atomic subroutines, as ordinary assignment and referencing are always subject to the segment ordering rules.
3.11 Normal termination of executionIf an image executes a STOP statement, or the END PROGRAM statement, normal termination is initiated. The other images continue execution, and all data on the "stopped" image remains; other images can continue to reference and define coarrays on the stopped image.
When normal termination has been initiated on all images, the program terminates.
3.12 Error terminationIf any image terminates due to an error, for example an input/output error in an input/output statement that does not have any IOSTAT= or ERR= specifier, the entire program is error terminated. On a distributed memory machine it may take some time for the error termination messages to reach every image, so the termination might not be immediate.
The ERROR STOP statement initiates error termination.
3.13 Fault toleranceThe draft Fortran 2018 standard adds many features for detecting, simulating, and recovering from image failure. For example, the FAIL IMAGE statement causes the executing image to fail (stop responding to accesses from other images). These extensions are listed in the detailed syntax below, even though they are not part of the Fortran 2008 standard.
The FAIL IMAGE statement itself is not very useful when the number of images is equal to one, as it inevitably causes complete program failure.
3.14 Detailed syntax of coarray featuresCoindexed object (data object designator):
In a data object designator, a part (component or base object) that is a coarray can include an image selector: part-name [ ( section-subscript-list ) ] [ image-selector ]where part-name identifies a coarray, and image-selector is
left-bracket cosubscript-list [ , image-selector-spec ] right-bracketThe number of cosubscripts must be equal to the corank of part-name. If image-selector appears and part-name is an array, section-subscript-list must also appear. The optional image-selector-spec is Fortran 2018 (part of the fault tolerance feature), and is a comma-separated list of one or more of the following specifiers:
STAT = scalar-int-variable
TEAM = team-value
TEAM_NUMBER = scalar-int-expression
CRITICAL construct:
[ construct-name : ] CRITICAL [ ( [ sync-stat-list ] ) ]
END CRITICAL [ construct-name ]
The block is not permitted to contain:
- a RETURN or STOP statement;
- an image control statement;
- a branch whose target is outside the construct.
FAIL IMAGE statement:
FAIL IMAGENote: This statement is Fortran 2018.
LOCK statement:
LOCK ( lock-variable [ , lock-stat-list ] )where lock-stat-list is a comma-separated list of one or more of the following:
ACQUIRED_LOCK = scalar-logical-variable
ERRMSG = scalar-default-character-variable
STAT = scalar-int-variable
SYNC ALL statement:
SYNC ALL [ ( [ sync-stat-list ] ) ]
SYNC IMAGES statement:
SYNC IMAGES ( image-set [ , sync-stat-list ] )where image-set is an asterisk, or an integer expression that is scalar or of rank one.
SYNC MEMORY statement:
SYNC MEMORY [ ( [ sync-stat-list ] ) ]
UNLOCK statement:
UNLOCK ( lock-variable [ , sync-stat-list ] )
- The variables in sync-stat-list or lock-stat-list are not permitted to be coindexed objects, nor may they depend on anything else in the statement.
3.15 Intrinsic procedures and coarrays
- is INTENT(OUT) scalar INTEGER(ATOMIC_INT_KIND) or LOGICAL(ATOMIC_LOGICAL_KIND), and must be a coarray or a coindexed object.
- is scalar with the same type as ATOM.
- (Optional) is scalar Integer and must have a decimal exponent range of at least four. It must not be coindexed.
- is INTENT(OUT) scalar with the same type as ATOM.
- is scalar INTEGER(ATOMIC_INT_KIND) or LOGICAL(ATOMIC_LOGICAL_KIND), and must be a coarray or a coindexed object.
- (Optional) is scalar Integer and must have a decimal exponent range of at least four. It must not be coindexed.
- a coarray of any type.
- an integer vector whose size is equal to the corank of COARRAY.
- coarray of any type and corank N;
- (Optional) scalar Integer in the range 1 to N;
- (Optional) scalar Integer constant expression;
- Result
- Integer or Integer(Kind=KIND).
SUBROUTINE MOVE_ALLOC(FROM, TO, STAT, ERRMSG) ! Revised
- an allocatable variable of any type.
- an allocatable with the same declared type, type parameters, rank and corank, as FROM.
- INTENT(OUT) scalar Integer with a decimal exponent range of at least four.
- INTENT(INOUT) scalar default character variable.
INTEGER FUNCTION NUM_IMAGES()This intrinsic function returns the number of images. In this release of the NAG Fortran Compiler, the value will always be equal to one.
INTEGER FUNCTION THIS_IMAGE()Returns the image index of the executing image.
FUNCTION THIS_IMAGE(COARRAY)Returns an array of type Integer with default kind, with the size equal to the corank of COARRAY, which may be a coarray of any type. The values returned are the cosubscripts for COARRAY that correspond to the executing image.
- is a coarray of any type.
- is scalar Integer.
- coarray of any type and corank N;
- (Optional) scalar Integer in the range 1 to N;
- (Optional) scalar Integer constant expression;
- Result
- Integer or Integer(Kind=KIND).
If DIM appears, the result is scalar, being the value of the upper cobound of that codimension of COARRAY. If DIM does not appear, the result is a vector of length N containing all the upper cobounds of COARRAY. The actual argument for DIM must not itself be an optional dummy argument.
Note that if COARRAY has corank N>1, and the number of images in the current execution is not an integer multiple of the coextents up to codimension N−1, the images do not make a full rectangular pattern. In this case, the value of the last upper cobound is the maximum value that a cosubscript can take for that codimension; e.g. with a coarray-spec of [1:3,1:*] and four images in the execution, the last upper cobound will be equal to 2 because the cosubscripts [1,2] are valid even though [2,2] and [2,3] are not.
4 Data declaration [mostly 6.0]
The maximum rank of an array has been increased from 7 to 15.
For example,
REAL array(2,2,2,2,2,2,2,2,2,2,2,2,2,2,2)declares a 15-dimensional array.
- [3.0] 64-bit integer support is required, that is, the result of SELECTED_INT_KIND(18) is a valid integer kind number.
A named constant (PARAMETER) that is an array can assume its shape from
its defining expression; this is called an implied-shape array.
The syntax is that the upper bound of every dimension must be an asterisk, for
REAL,PARAMETER :: idmat3(*,*) = Reshape( [ 1,0,0,0,1,0,0,0,1 ], [ 3,3 ] ) REAL,PARAMETER :: yeardata(2000:*) = [ 1,2,3,4,5,6,7,8,9 ]declares idmat3 to have the bounds (1:3,1:3), and yeardata to have the bounds (2000:2008).
The TYPE keyword can be used to declare entities of intrinsic type,
simply by putting the intrinsic type-spec within the parentheses.
For example,
TYPE(REAL) x TYPE(COMPLEX(KIND(0d0))) y TYPE(CHARACTER(LEN=80)) zis completely equivalent, apart from being more confusing, to
REAL x COMPLEX(KIND(0d0)) y CHARACTER(LEN=80) z
- As a consequence of the preceding extension, it is no longer permitted to define a derived type that has the name DOUBLEPRECISION.
[5.3] A type-bound procedure declaration statement may now declare multiple
type-bound procedures. For example, instead of
PROCEDURE,NOPASS :: a PROCEDURE,NOPASS :: b=>x PROCEDURE,NOPASS :: cthe single statement
PROCEDURE,NOPASS :: a, b=>x, cwill suffice.
5 Data usage and computation [mostly 5.3]
- In a structure constructor, the value for an allocatable component may be omitted: this has the same effect as specifying NULL().
When allocating an array with the ALLOCATE statement, if SOURCE=
or MOLD= is present and its expression is an array, the array can take
its shape directly from the expression.
This is a lot more concise than using SIZE or UBOUND, especially
for a multi-dimensional array.
For example,
SUBROUTINE s(x,mask) REAL x(:,:,:) LOGICAL mask(:,:,:) REAL,ALLOCATABLE :: y(:,:,:) ALLOCATE(y,MOLD=x) WHERE (mask) y = 1/x ELSEWHERE y = HUGE(x) END WHERE ! ... END SUBROUTINE
An ALLOCATE statement with the SOURCE= clause is permitted to
have more than one allocation.
The source-expr is assigned to every variable allocated in the statement.
For example,
PROGRAM multi_alloc INTEGER,ALLOCATABLE :: x(:),y(:,:) ALLOCATE(x(3),y(2,4),SOURCE=42) PRINT *,x,y END PROGRAMwill print the value "42" eleven times (the three elements of x and the eight elements of y). If the source-expr is an array, every allocation needs to have the same shape.
The real and imaginary parts of a COMPLEX object can be accessed using
the complex part designators '%RE' and '%IM'.
For example, given
COMPLEX,PARAMETER :: c = (1,2), ca(2) = [ (3,4),(5,6) ]the designators c%re and c%im have the values 1 and 2 respectively, and ca%re and ca%im are arrays with the values [ 3,5 ] and [ 4,6 ] respectively. In the case of variables, for example
COMPLEX :: v, va(10)the real and imaginary parts can also be assigned to directly; the statement
va%im = 0will set the imaginary part of each element of va to zero without affecting the real part.
In an ALLOCATE statement for one or more variables, the MOLD=
clause can be used to give the variable(s) the dynamic type and type parameters
(and optionally shape) of an expression.
The expression in MOLD= must be type-compatible with each
allocate-object, and if the expression is a variable (e.g. MOLD=X), the
variable need not be defined.
Note that the MOLD= clause may appear even if the type, type parameters
and shape of the variable(s) being allocated are not mutable.
For example,
CLASS(*),POINTER :: a,b,c ALLOCATE(a,b,c,MOLD=125)will allocate the unlimited polymorphic pointers A, B and C to be of type Integer (with default kind); unlike SOURCE=, the values of A, B and C will be undefined.
[5.3.1] Assignment to a polymorphic allocatable variable is permitted.
If the variable has different dynamic type or type parameters, or if an array, a
different shape, it is first deallocated.
If it is unallocated (or is deallocated by step 1), it is then allocated to
have the correct type and shape.
It is then assigned the value of the expression.
Note that the operaton of this feature is similar to the way that
ALLOCATE(variable,SOURCE=expr) works.
For example, given
CLASS(*),ALLOCATABLE :: xexecution of the assignment statement
x = 43will result in X having dynamic type Integer (with default kind) and value 43, regardless of whether X was previously unallocated or allocated with any other type (or kind).
Rank-remapping pointer assignment is now permitted when the target has rank
greater than one, provided it is "simply contiguous" (a term which means
that it must be easily seen at compile-time to be contiguous).
For example, the pointer assignment in
REAL,TARGET :: x(100,100) REAL,POINTER :: x1(:) x1(1:Size(x)) => xestablishes X1 as a single-dimensional alias for the whole of X.
6 Execution control [mostly 6.0]
The BLOCK construct allows declarations of entities within executable
For example,
Do i=1,n Block Real tmp tmp = a(i)**3 If (tmp>b(i)) b(i) = tmp End Block End DoHere the variable tmp has its scope limited to the BLOCK construct, so will not affect anything outside it. This is particularly useful when including code by INCLUDE or by macro preprocessing.
All declarations are allowed within a BLOCK construct except for COMMON, EQUIVALENCE, IMPLICIT, INTENT, NAMELIST, OPTIONAL and VALUE; also, statement function definitions are not permitted.
BLOCK constructs may be nested; like other constructs, branches into a BLOCK construct from outside are not permitted. A branch out of a BLOCK construct "completes" execution of the construct.
Entities within a BLOCK construct that do not have the SAVE attribute (including implicitly via initialisation), will cease to exist when execution of the construct is completed. For example, an allocated ALLOCATABLE variable will be automatically deallocated, and a variable with a FINAL procedure will be finalised.
- The EXIT statement is no longer restricted to exiting from a DO construct; it can now be used to jump to the end of a named ASSOCIATE, BLOCK, IF, SELECT CASE or SELECT TYPE construct (i.e. any named construct except FORALL and WHERE). Note that an EXIT statement with no construct-name still exits from the innermost DO construct, disregarding any other named constructs it might be within.
- In a STOP statement, the stop-code may be any scalar constant expression of type integer or default character. (In the NAG Fortran Compiler this also applies to the PAUSE statement, but that statement is no longer standard Fortran.) Additionally, the STOP statement with an integer stop-code now returns that value as the process exit status (on most operating systems there are limits on the value that can be returned, so for the NAG Fortran Compiler this returns only the lower eight bits of the value).
The ERROR STOP statement has been added.
This is similar to the STOP statement, but causes error termination
rather than normal termination.
The syntax is identical to that of the STOP statement apart from the
extra keyword 'ERROR' at the beginning.
Also, the default process exit status is zero for normal termination, and
non-zero for error termination.
For example,
IF (x<=0) ERROR STOP 'x must be positive'
The FORALL construct now has an optional type specifier in the initial
statement of the construct, which can be used to specify the type (which must
be INTEGER) and kind of the index variables.
When this is specified, the existence or otherwise of any entity in the outer
scope that has the same name as an index variable does not affect the index
variable in any way.
For example,
Complex i(100) Real x(200) ... Forall (Integer :: i=1:Size(x)) x(i) = i
Note that the FORALL construct is still not recommended for high performance, as the semantics imply evaluating the right-hand sides into array temps the size of the iteration space, and then assigning to the variables; this usually performs worse than ordinary DO loops.
The DO CONCURRENT construct is a DO loop with restrictions and
semantics intended to allow efficient execution.
The iterations of a DO CONCURRENT construct may be executed in any
order, and possibly even in parallel.
The loop index variables are local to the construct.
The DO CONCURRENT header has similar syntax to the FORALL header, including the ability to explicitly specify the type and kind of the loop index variables, and including the scalar mask.
The restrictions on the DO CONCURRENT construct are:
- no branch is allowed from within the construct to outside of it (this includes the RETURN and STOP statements, but ERROR STOP is allowed);
- the EXIT statement cannot be used to terminate the loop;
- the CYCLE statement cannot refer to an outer loop;
- there must be no dependencies between loop iterations, and if a variable is assigned to by any iteration, it is not allowed to be referenced by another iteration unless that iteration assigns it a value first;
- all procedures referenced within the construct must be pure;
- no image control statements can appear within the loop;
- no reference to IEEE_GET_FLAG or IEEE_SET_HALTING_MODE is allowed.
For example,
Integer vsub(n) ... Do Concurrent (i=1:n) ! Safe because vsub has no duplicate values. x(vsub(i)) = i End Do
The full syntax of the DO CONCURRENT statement is:
[ do-construct-name : ] DO [ label ] [ , ] CONCURRENT forall-headerwhere forall-header is
( [ integer-type-spec :: ] triplet-spec [ , triplet-spec ]... [ , mask-expr ] )where mask-expr is a scalar logical expression, and triplet-spec is
name = expr : expr [ : expr ]
7 Intrinsic procedures and modules
7.1 Additional mathematical intrinsic functions [mostly 5.3.1]
The elemental intrinsic functions ACOSH, ASINH and ATANH
compute the inverse hyperbolic cosine, sine or tangent respectively.
There is a single argument X, which may be of type Real or Complex; the
result of the function has the same type and kind.
When the argument is Complex, the imaginary part is expressed in radians and
lies in the range 0≤im≤π for the ACOSH function, and
−π/2≤im≤π/2 for the ASINH and ATANH functions.
For example, ACOSH(1.543081), ASINH(1.175201) and ATANH(0.7615942) are all approximately equal to 1.0.
- [6.1] The new elemental intrinsic functions BESSEL_J0, BESSEL_Y0, BESSEL_J1 and BESSEL_Y1 compute the Bessel functions J0, Y0, J1 and Y1 respectively. These functions are solutions to Bessel's differential equation. The J functions are of the 1st kind and the Y functions are of the 2nd kind; the following subscript indicates the order (0 or 1). There is a single argument X, which must be of type Real; the result of the function has the same type and kind. For functions of the 2nd kind (BESSEL_Y0 and BESSEL_Y1), the argument X must be positive. For example, BESSEL_J0(1.5) is approximately 0.5118276, BESSEL_Y0(1.5) is approximately 0.3824489, BESSEL_J1(1.5) is approximately 0.5579365 and BESSEL_Y1(1.5) is approximately -0.4123086.
The new intrinsic functions BESSEL_JN and BESSEL_YN compute the
Bessel functions Jn and Yn respectively.
These functions come in two forms: an elemental form and a transformational
The elemental form has two arguments: N, the order of the function to compute, and X, the argument of the Bessel function. BESSEL_JN(0,X) is identical to BESSEL_J0(X), etc..
The transformational form has three scalar arguments: N1, N2 and X. The result is a vector of size MAX(N2-N1+1,0), containing approximations to the Bessel functions of orders N1 to N2 applied to X.
For example, BESSEL_JN(5,7.5) is approximately 0.283474, BESSEL_YN(5,7.5) is approximately 0.175418, BESSEL_JN(3,5,7.5) is approximately [ -0.258061, 0.023825, 0.283474 ] and BESSEL_YN(3,5,7.5) is approximately [ 0.159708, 0.314180, 0.175418 ].
[6.0] The elemental intrinsic functions ERF, ERFC and ERFC
compute the error function, the complementary error function and the scaled
complementary error function, respectively.
The single argument X must be of type real.
The error function is the integral of −t2 from 0 to X, times 2/SQRT(π); this rapidly converges to 1. The complementary error function is 1 minus the error function, and fairly quickly converges to zero. The scaled complementary error function scales the value (of 1 minus the error function) by EXP(X**2); this also converges to zero but only very slowly.
[6.0] The elemental intrinsic functions GAMMA and LOG_GAMMA
compute the gamma function and the natural logarithm of the absolute value of
the gamma function respectively.
The single argument X must be of type real, and must not be zero or a
negative integer.
The gamma function is the extension of factorial from the integers to the reals; for positive integers, GAMMA(X) is equal to (X−1)!, i.e. factorial of X−1. This grows very rapidly and thus overflows for quite small X; LOG_GAMMA also diverges but much more slowly.
The elemental intrinsic function HYPOT computes the
"Euclidean distance function" (square root of the sum of squares) of its
arguments X and Y without overflow or underflow for very large or
small X or Y (unless the result itself overflows or underflows).
The arguments must be of type Real with the same kind, and the result is of
type Real with that kind.
Note that HYPOT(X,Y) is semantically and numerically equal to
For example, HYPOT(3e30,4e30) is approximately equal to 5e30.
The array reduction intrinsic function NORM2(X,DIM) reduces Real arrays
using the L2-norm operation.
This operates exactly the same as SUM and PRODUCT, except for
the operation involved.
The L2 norm of an array is the square root of the sum of the squares
of the elements.
Note that unlike most of the other reduction functions, NORM2 does not
have a MASK argument.
The DIM argument is optional; an actual argument for DIM is not
itself permitted to be an optional dummy argument.
The calculation of the result value is done in such a way as to avoid intermediate overflow and underflow, except when the result itself is outside the maximum range. For example, NORM2([X,Y]) is approximately the same as HYPOT(X,Y).
7.2 Additional intrinsic functions for bit manipulation [mostly 5.3]
The elemental intrinsic functions BGE, BGT, BLE and
BLT perform bitwise (i.e. unsigned) comparisons.
They each have two arguments, I and J, which must be of type
Integer but may be of different kind.
The result is default Logical.
For example, BGE(INT(Z'FF',INT8),128) is true, while INT(Z'FF',INT8)>=128 is false.
The elemental intrinsic functions DSHIFTL and DSHIFTR perform
double-width shifting.
They each have three arguments, I, J and SHIFT which must
be of type Integer, except that one of I or J may be a BOZ literal
constant – it will be converted to the type and kind of the other I or
J argument.
I and J must have the same kind if they are both of type Integer.
The result is of type Integer, with the same kind as I and J.
The I and J arguments are effectively concatenated to form a
single double-width value, which is shifted left or right by SHIFT
positions; for DSHIFTL the result is the top half of the combined shift,
and for DSHIFTR the result is the bottom half of the combined shift.
For example, DSHIFTL(INT(B'11000101',1),B'11001001',2) has the value INT(B'00010111',1) (decimal value 23), whereas DSHIFTR(INT(B'11000101',1),B'11001001',2) has the value INT(B'01110010',1) (decimal value 114).
- The array reduction intrinsic functions IALL, IANY and IPARITY reduce arrays using bitwise operations. These are exactly the same as SUM and PRODUCT, except that instead of reducing the array by the + or * operation, they reduce it by the IAND, IOR and IEOR intrinsic functions respectively. That it, each element of the result is the bitwise-and, bitwise-or, or bitwise-exclusive-or of the reduced elements. If the number of reduced elements is zero, the result is zero for IANY and IPARITY, and NOT(zero) for IALL.
- The elemental intrinsic functions LEADZ and TRAILZ return the number of leading (most significant) and trailing (least significant) zero bits in the argument I, which must be of type Integer (of any kind). The result is default Integer.
- The elemental intrinsic functions MASKL and MASKR generate simple left-justified and right-justified bitmasks. The value of MASKL(I,KIND) is an integer with the specified kind that has its leftmost I bits set to one and the rest set to zero; I must be non-negative and less than or equal to the bitsize of the result. If KIND is omitted, the result is default integer. The value of MASKR is similar, but has its rightmost I bits set to one instead.
The elemental intrinsic function MERGE_BITS(I,J,MASK) merges the bits
from Integer values I and J, taking the bit from I when
the corresponding bit in MASK is 1, and taking the bit from
J when it is zero.
All arguments must be BOZ literal constants or of type Integer, and all the
Integer arguments must have the same kind; at least one of I and
J must be of type Integer, and the result has the same type and kind.
Note that MERGE_BITS(I,J,MASK) is identical to IOR(IAND(I,MASK),IAND(J,NOT(MASK))).
For example, MERGE_BITS(INT(B'00110011',1),B'11110000',B'10101010') is equal to INT(B'01110010') (decimal value 114).
- The array reduction intrinsic function PARITY reduces Logical arrays. It is exactly the same as ALL and ANY, except that instead of reducing the array by the .AND. or .OR. operation, it reduces it by the .NEQV. operation. That is, each element of the result is .TRUE. if an odd number of reduced elements is .TRUE..
- The elemental intrinsic function POPCNT(I) returns the number of bits in the Integer argument I that are set to 1. The elemental intrinsic function POPPAR(I) returns zero if the number of bits in I that are set to 1 are even, and one if it is odd. The result is default Integer.
7.3 Other new intrinsic procedures [mostly 5.3.1]
The intrinsic subroutine EXECUTE_COMMAND_LINE passes a command line to
the operating system's command processor for execution.
It has five arguments, in order these are:
CHARACTER(*),INTENT(IN) :: COMMAND — the command to be executed;
LOGICAL,INTENT(IN),OPTIONAL :: WAIT — whether to wait for command completion (default true);
INTEGER,INTENT(INOUT),OPTIONAL :: EXITSTAT — the result value of the command;
INTEGER,INTENT(OUT),OPTIONAL :: CMDSTAT — see below;
CHARACTER(*),INTENT(INOUT),OPTIONAL :: CMDMSG — the error message if CMDSTAT is non-zero.
CMDSTAT values are zero for success, −1 if command line execution is not supported, −2 if WAIT is present and false but asynchronous execution is not supported, and a positive value to indicate some other error. If CMDSTAT is not present but would have been set non-zero, the program will be terminated. Note that Release 5.3.1 supports command line execution on all systems, and does not support asynchronous execution on any system.
For example, CALL EXECUTE_COMMAND_LINE('echo Hello') will probably display 'Hello' in the console window.
The intrinsic function STORAGE_SIZE(A,KIND) returns the size in bits of
a scalar object with the same dynamic type and type parameters as A,
when it is stored as an array element (i.e. including any padding).
The KIND argument is optional; the result is type Integer with kind
KIND if it is present, and default kind otherwise.
If A is allocatable or a pointer, it does not have to be allocated unless it has a deferred type parameter (e.g. CHARACTER(:)) or is CLASS(*). If it is a polymorphic pointer, it must not have an undefined status.
For example, STORAGE_SIZE(13_1) is equal to 8 (bits).
- [6.0] The intrinsic inquiry function IS_CONTIGUOUS has a single argument ARRAY, which can be an array of any type. The function returns true if ARRAY is stored contiguously, and false otherwise. Note that this question has no meaning for an array with no elements, or for an array expression since that is a value and not a variable.
7.4 Changes to existing intrinsic procedures [mostly 5.3.1]
- The intrinsic functions ACOS, ASIN, ATAN, COSH, SINH, TAN and TANH now accept arguments of type Complex. Note that the hyperbolic and non-hyperbolic versions of these functions and the new ACOSH, ASINH and ATANH functions are all related by simple algebraic identities, for example the new COSH(X) is identical to the old COS((0,1)*X) and the new SINH(X) is identical to the old (0,-1)*SIN((0,1)*X).
- The intrinsic function ATAN now has an extra form ATAN(Y,X), with exactly the same semantics as ATAN2(Y,X).
The intrinsic functions MAXVAL and MINVAL now have an additional
optional argument BACK following the KIND argument.
It is scalar and of type Logical; if present with the value .True., if
there is more than one element that has the maximum value (for MAXVAL)
or minimum value (for MINVAL), the array element index returned is for
the last element with that value rather than the first.
For example, the value of
MAXVAL( [ 5,1,5 ], BACK=.TRUE.)is the array [ 3 ], rather than [ 1 ].
- The intrinsic function SELECTED_REAL_KIND now has a third argument RADIX; this specifies the desired radix of the Real kind requested. Note that the function IEEE_SELECTED_REAL_KIND in the intrinsic module IEEE_ARITHMETIC also has this new third argument, and will allow requesting IEEE decimal floating-point kinds if they become available in the future.
7.5 ISO_C_BINDING additions [6.2]The standard intrinsic module ISO_C_BINDING contains an additional procedure as follows.
INTERFACE c_sizeof PURE INTEGER(c_size_t) FUNCTION c_sizeof...(x) ! Specific name not visible TYPE(*) :: x(..) END FUNCTION END INTERFACE
The actual argument x must be interoperable. The result is the same as the C sizeof operator applied to the conceptually corresponding C entity; that is, the size of x in bytes. If x is an array, it is the size of the whole array, not just one element. Note that x cannot be an assumed-size array.
7.6 ISO_FORTRAN_ENV additions[5.3] The standard intrinsic module ISO_FORTRAN_ENV contains additional named constants as follows.
- The additional scalar integer constants INT8, INT16, INT32, INT64, REAL32, REAL64 and REAL128 supply the kind type parameter values for integer and real kinds with the indicated bit sizes.
- The additional named array constants CHARACTER_KINDS, INTEGER_KINDS, LOGICAL_KINDS and REAL_KINDS list the available kind type parameter values for each type (in no particular order).
[6.1] The standard intrinsic module ISO_FORTRAN_ENV contains two new functions as follows.
This function is pure, has no arguments, and returns a scalar default character
string that identifies the version of the compiler that was used to compile the
source file.
This function may be used in a constant expression, e.g. to initialise a
variable or named constant with this information.
For example,
Module version_info Use Iso_Fortran_Env Character(Len(Compiler_Version())) :: compiler = Compiler_Version() End Module Program show_version_info Use version_info Print *,compiler End ProgramWith release 6.1 of the NAG Fortran Compiler, this program will print something like
NAG Fortran Compiler Release 6.1(Tozai) Build 6105
This function is pure, has no arguments, and returns a scalar default character
string that identifies the options supplied to the compiler when the source
file was compiled.
This function may be used in a constant expression, e.g. to initialise a
variable or named constant with this information.
For example,
Module options_info Use Iso_Fortran_Env Character(Len(Compiler_Options())) :: compiler = Compiler_Options() End Module Program show_options_info Use options_info Print *,compiler End ProgramIf compiled with the options -C=array -C=pointer -O, this program will print something like
-C=array -C=pointer -O
8 Input/output extensions [mostly 5.3]
The NEWUNIT= specifier has been added to the OPEN statement; this
allocates a new unit number that cannot clash with any other logical unit (the
unit number will be a special negative value).
For example,
INTEGER unit OPEN(FILE='output.log',FORM='FORMATTED',NEWUNIT=unit) WRITE(unit,*) 'Logfile opened.'The NEWUNIT= specifier can only be used if either the FILE= specifier is also used, or if the STATUS= specifier is used with the value 'SCRATCH'.
Recursive input/output is allowed on separate units.
For example, in
Write (*,Output_Unit) f(100)the function f is permitted to perform i/o on any unit except Output_Unit; for example, if the value 100 is out of range, it would be allowed to produce an error message with
Write (*,Error_Unit) 'Error in F:',n,'is out of range'
[6.0] A sub-format can be repeated an indefinite number of times by using an
asterisk (*) as its repeat count. For example,
SUBROUTINE s(x) LOGICAL x(:) PRINT 1,x 1 FORMAT('x =',*(:,' ',L1)) END SUBROUTINEwill display the entire array x on a single line, no matter how many elements x has. An infinite repeat count is only allowed at the top level of the format specification, and must be the last format item.
[6.0] The G0 and G0.d edit descriptors perform generalised
editing with all leading and trailing blanks (except those within a character
value itself) omitted.
For example,
PRINT 1,1.25,.True.,"Hi !",123456789 1 FORMAT(*(G0,','))produces the output
1.250000,T,Hi !,123456789,
9 Programs and procedures [mostly 5.3]
- An empty internal subprogram part, module subprogram part or type-bound procedure part is now permitted following a CONTAINS statement. In the case of the type-bound procedure part, an ineffectual PRIVATE statement may appear following the unnecessary CONTAINS statement.
An internal procedure can be passed as an actual argument or assigned to a
procedure pointer.
When the internal procedure is invoked via the dummy argument or procedure
pointer, it can access the local variables of its host procedure.
In the case of procedure pointer assignment, the pointer is only valid until
the host procedure returns (since the local variables cease to exist at that
For example,
SUBROUTINE mysub(coeffs) REAL,INTENT(IN) :: coeffs(0:) ! Coefficients of polynomial. REAL integral integral = integrate(myfunc,0.0,1.0) ! Integrate from 0.0 to 1.0. PRINT *,'Integral =',integral CONTAINS REAL FUNCTION myfunc(x) RESULT(y) REAL,INTENT(IN) :: x INTEGER i y = coeffs(UBOUND(coeffs,1)) DO i=UBOUND(coeffs,1)-1,0,-1 y = y*x + coeffs(i) END DO END FUNCTION END SUBROUTINE
The rules used for generic resolution and for checking that procedures in a
generic are unambiguous have been extended.
The extra rules are that
- a dummy procedure is distinguishable from a dummy variable;
- an ALLOCATABLE dummy variable is distinguishable from a POINTER dummy variable that does not have INTENT(IN).
- [6.0] A disassociated pointer, or an unallocated allocatable variable, may be passed as an actual argument to an optional nonallocatable nonpointer dummy argument. This is treated as if the actual argument were not present.
Impure elemental procedures can be defined using the IMPURE keyword.
An impure elemental procedure has the restrictions that apply to elementality
(e.g. all arguments must be scalar) but does not have any of the "pure"
restrictions. This means that an impure elemental procedure may have side
effects and can contain input/output and STOP statements.
For example,
Impure Elemental Integer Function checked_addition(a,b) Result(c) Integer,Intent(In) :: a,b If (a>0 .And. b>0) Then If (b>Huge(c)-a) Stop 'Positive Integer Overflow' Else If (a<0 .And. b<0) Then If ((a+Huge(c))+b<0) Stop 'Negative Integer Overflow' End If c = a + b End FunctionWhen an argument is an array, an impure elemental procedure is applied to each element in array element order (unlike a pure elemental procedure, which has no specified order). An impure elemental procedure cannot be referenced in a context that requires a procedure to be pure, e.g. within a FORALL construct.
Impure elemental procedures are probably most useful for debugging (because i/o is allowed) and as final procedures.
If an argument of a pure procedure has the VALUE attribute it does not
need any INTENT attribute.
For example,
PURE SUBROUTINE s(a,b) REAL,INTENT(OUT) :: a REAL,VALUE :: b a = b END SUBROUTINE
Note however that the second argument of a defined assignment subroutine, and all arguments of a defined operator function, are still required to have the INTENT(IN) attribute even if they have the VALUE attribute.
- [5.3.1] The FUNCTION or SUBROUTINE keyword on the END statement for an internal or module subprogram is now optional (when the subprogram name does not appear). Previously these keywords were only optional for external subprograms.
- ENTRY statements are regarded as obsolescent.
- [1.0] A line in the program is no longer prohibited from beginning with a semi-colon.
[6.2] The name of an external procedure with a binding label is now considered
to be a local identifier only, and not a global identifier.
That means that code like the following is now standard-conforming:
SUBROUTINE sub() BIND(C,NAME='one') PRINT *,'one' END SUBROUTINE SUBROUTINE sub() BIND(C,NAME='two') PRINT *,'two' END SUBROUTINE PROGRAM test INTERFACE SUBROUTINE one() BIND(C) END SUBROUTINE SUBROUTINE two() BIND(C) END SUBROUTINE END INTERFACE CALL one CALL two END PROGRAM
- [6.2] An internal procedure is permitted to have the BIND(C) attribute, as long as it does not have a NAME= specifier. Such a procedure is interoperable with C, but does not have a binding label (as if it were specified with NAME='').
A dummy argument with the VALUE attribute is permitted to be an array,
and is permitted to be of type CHARACTER with length non-constant and/or
not equal to one.
(It is still not permitted to have the ALLOCATABLE or POINTER
attributes, and is not permitted to be a coarray.)
The effect is that a copy is made of the actual argument, and the dummy argument is associated with the copy; any changes to the dummy argument do not affect the actual argument. For example,
PROGRAM value_example_2008 INTEGER :: a(3) = [ 1,2,3 ] CALL s('Hello?',a) PRINT '(7X,3I6)',a CONTAINS SUBROUTINE s(string,j) CHARACTER(*),VALUE :: string INTEGER,VALUE :: j(:) string(LEN(string):) = '!' j = j + 1 PRINT '(7X,A,3I6)',string,j END SUBROUTINE END PROGRAMwill produce the output
Hello! 2 3 4 1 2 3
10 References
The Fortran 2008 standard, IS 1539-1:2010(E), is available from ISO as well as from many national standards bodies. A number of books describing the new standard are available; the recommended reference book is "Modern Fortran Explained" by Metcalf, Reid & Cohen, Oxford University Press, 2011 (ISBN 978-0-19-960141-7).


text:
Screening & Separation
Bunting Achieves CE Certification for HF Drawer Magnet ProductsNovember 4, 2008
The Bunting Magnetics Co. HF Series drawer magnet product line has earned the CE mark for the European Economic Area (EEA). The CE marking certifies that a product has met EU health, safety, and environmental requirements, which ensures consumer safety. The CE certification pertains to Bunting...comment
Moreland Picked to Manage Sales at Oliver ManufacturingOctober 31, 2008
Oliver Manufacturing Co. of Rocky Ford and La Junta, Colorado has hired Jon E. Moreland as its sales manager. Moreland will take the lead in marketing and sales and oversee the development of product identity and public relations, marketing and business operations. Most recently, Moreland was...comment
Bunting Magnetics Appoints New Product Manager for Magnetic Separation Product LineOctober 29, 2008
Rick Bigham has been named as the new product manager – magnetic separation for Bunting Magnetics Co., headquartered in Newton, Kansas. "The magnetic separation product line is historically our largest in terms of sales and overall importance to the company," Robert J....comment
ClassifierOctober 28, 2008
The Alpha classifier was developed for the production of fine products from 150 down to 6 µm and is especially suited for dry powders—both mineral and chemical. Depending on the fineness required, this equipment can be fed by gravity from the top or in the main airstream from below, and...comment
Large Tube HousingOctober 28, 2008
This new product incorporates the purification standards of a Rare Earth magnetic circuit with the innovations of a drawer-housing design. The company has taken the magnetic circuit found in pneumatic inline magnets, or bullet magnets, and incorporated it into a housing. It is ideal for gravity-fed...comment
Manual Clean Drawer MagnetOctober 28, 2008
Engineered to remove medium and fine ferrous contaminants from dry, free-flowing products under gravity flow, this drawer magnet protects processing machinery and improves product purity. Multiple staggered rows provide maximum contact area for product flow. As product flows through the stainless-...comment
Vibratory ScreenerOctober 28, 2008
The Omni-Screener produces superior control and classifying results in bulk material processing applications. Material moves in a spiral flow from a central in-feed point, developing extended residence time for near-size particles. Units can have multiple deck surfaces for variable screening, while...comment
Centrifugal SifterOctober 28, 2008
The KEK cantilever-design centrifugal sifter provides excellent size reduction for a variety of applications including classification, deagglomeration, bulk conditioning, scalping, in-line sifting, policing raw material, de-watering, reclaiming damaged product, and de-dusting of reground product....comment
ScreenerOctober 28, 2008
The Apex screener comes standard with the same features found on the Rotex screener including gyratory-reciprocating motion, positive screen cleaning, bouncing balls to reduce blinding, and inlet/outlet connections. However, the Apex is enhanced with side-access doors to enable efficient screen...comment
Rotary Drum ScreenOctober 28, 2008
This self-cleaning rotary drum screen separates solid debris from wastewater at high rates with low-energy usage. The unit contains a rotating cylinder constructed of wedge wire screen with a stationary doctor blade on the outside of the cylinder and an internal spray line. Effluent discharges from...comment

subset: commoncrawl


text:
The World Beyond the West & The Problem of Eurocentrism
Eurocentrism is the tradition of focusing on the ancient Greeks and Western Europeans to understand ourselves and our history. Eurocentrism is based on the assumption that there is a separate and distinct culture known as "the West", superior to other cultures in knowledge, wisdom and freedom, and this explains the impressive achievements of Western science, philosophy and politics.
Many authors, teachers and professors accept this assumption without question, but it is rarely demonstrated with direct comparisons, by comparing the ancient Greeks to the ancient Egyptians and Persians or by comparing the European Enlightenment to the earlier golden ages of China and Islam. Though the Greeks got much from the Egyptians and Persians, as the Europeans did from the Chinese and Muslims, this is often ignored. When comparisons are made, they often use a small number of examples to support the traditional Eurocentric view that the West is superior to all other cultures.
Eurocentrism cannot be found amongst the ancient Greeks or Romans, who did not identify with each other or with the tribes of Western Europe. Romans thought Germanic and Celtic tribespeople were barbaric and inferior, owning them as slaves in Rome and depicting them as savages in art. Julius Caesar wrote that the Gauls were primitive, warlike, and immoral, justifying their conquest and enslavement. These are the very things Europeans would use to justify the domination of Africa and the Americas thousands of years later. Rome enriched itself and financed the construction of impressive buildings with the wealth and slave labor reaped from the conquered. Western European culture was almost entirely destroyed and replaced with Roman culture. This is why witches, the shamans of their tribes, were burned at the stake and are still portrayed as evil today.
After the fall of Rome, in one of the most remarkable cases of Stockholm syndrome in history, the conquered identified themselves with their conquerors and adopted Roman history and identity as their own to make claims to power and lineage. Then, after the Protestant Reformation, many Western Europeans ceased to identify with Rome and chose instead to identify exclusively with the ancient Greeks. As Christianity had passed from Greece through Rome to Europe, Protestants turned from Latin sources back to Greek to retranslate the Bible, discovering the wisdom and knowledge of the Greeks in the process.
Over the last five hundred years, as Western Europe rose in power, wealth and dominance, the Europeans explained their successes in terms of Greek and Roman history and identity. What was in medieval times called Christendom, and then during the Enlightenment called the European race, is in modern times called "The West", still portrayed as distinct and superior.
This is why the Nazis invented the Olympic torch run which passed a flame from Athens to Berlin in 1936, a symbol of the superiority of the Western mind and reason. Hitler saw the Nazis as a rebirth of Western Civilization, and argued that the Germans should look to the Greeks and Romans to be inspired by their fellow superior Aryans, even though the Greeks and Romans thought that Germans were subhuman and incapable of reason or government. Perhaps the Nazis were trying to prove the Romans were right.
Between the fall of Rome and the rise of Western Europe, the Tang and Song dynasties of China and the golden age of Islam developed much of the technology, scholarship and science that was crucial for the Renaissance and European Enlightenment. In 1620, Sir Francis Bacon wrote that gunpowder, the magnetic compass and printing were the most significant advancements of humankind, separating ancient from modern times, unaware that all three were Chinese. Karl Marx argued that these same three inventions brought about capitalism and the middle class. Along with these, paper, books, cast iron, gears, the belt drive, the chain drive, the spring, the waterwheel and the windmill all passed from China into Islamic lands and then into Europe.
The Muslims added algebra, possibly the most useful invention in history, based on Egyptian, Indian and Greek mathematics. The Chinese and Muslims, like the Greeks and Romans, passed many things on to Western Europe, which was and is neither Greece nor Rome nor China.
The history of human thought and culture is our common heritage, which includes everything brilliant, and everything stupid, that our species has ever done. All cultures have sought knowledge and wisdom, even though ignorance and arrogance is also all too human. We can learn about ourselves from the achievements and problems of all cultures, and we inherit traditions and innovations from many cultures. Why be Eurocentric when a wider perspective shows us much more? Why pay attention to one set of cross-cultural influences, when the whole is our history?
Thinking Beyond Racism
Many people believe that there are exclusive and separate human races and that some races are naturally smart and kind while others are unintelligent and mean. This is all mistaken, modern day mythology. There is more genetic variation between individuals than between ethnic groups. There is no genetic evidence that some ethnic groups are smarter or kinder, and individuals can increase their intelligence and compassion throughout their lives regardless of their genes.
The interactions we have with others create categories and frames in our heads that mislead us into thinking that certain types of people are smart or unkind and mislead us into treating them as separate types of people. Neuroscientists have shown that within milliseconds we identify others by ethnicity, gender and age, before we have a chance to think or speak. This can negatively frame our thinking, communication, and interactions. We naturally show frustration and negative emotions when we consider someone a threat, and this reinforces these reactions in ourselves and in others, including children, whether or not we're aware of it. Psychologists have shown that we are all somewhat racist, the privileged and disadvantaged, some of us more so, and some less so. We are all imprinted with negative attitudes towards ethnicities who share our common culture, even if we actively ignore it in ourselves or live where racism is far more covert than overt, more thought to oneself than spoken out loud.
As Europe rose in wealth and power over the last five hundred years, Europeans dominated Africa and the Americas and labeled Africans, Latinos, and Native Americans as savage and inferior. We're still dealing with this today.
In our diverse society, it is mentally and physically healthier to talk about our problems rather than ignore them and to discourage the idea that we are on opposing teams. When we focus on not making mistakes, this has a negative impact on our thinking and the perceptions of others, but when we focus on having a positive and open interaction, this is good for thinking and communication. Positivity helps us see each other as individuals and not as categories. Understanding that our thinking and personalities are not fixed, but can be enriched and developed, helps us to identify with each other and thrive.
Confucius said that if you put yourself with any two people at random, you can take their strengths as a model to follow and their faults as a warning. This is wise advice, as we all share similar strengths and faults. Intelligence and compassion are human virtues. Ignorance and brutality are human problems. We can see these are valued and useful yet difficult to develop in all human cultures, ancient and modern. Just as genetics shows we are actually one race with a variety of interrelated ethnicities, we share one culture with many cross-pollinating branches of subculture. We can draw on excellent and terrible examples from all of humanity to become better people. While this may seem obvious, it is easily forgotten.
Avicenna's Floating Man & Descartes' Deceiving Demon
While many Intro Philosophy classes cover Descartes' Deceiving Demon thought experiment, few cover Avicenna's Floating Man thought experiment, which is remarkably similar 600 years earlier.
Avicenna was one of the greatest and most famous philosophers and doctors of his day. His name, Ibn Sina in Arabic, was Latinized as his works were read by many in Europe before and during the Renaissance and European Enlightenment.
His Canon of Medicine was used as a textbook in Europe until the 1700s, based on experimentation and clinical trials, fusing Persian, Greek, Indian and other traditions of medicine together. He was also a pioneer of equations and propositional algebra, which would be developed later by Descartes into his Cartesian coordinates and by Newton and Leibniz into Calculus.
In his floating man thought experiment, Avicenna, who worked with anesthetics like opium in public hospitals, asks us to imagine that we are slowly unable to feel our feet, then body, then sight and sensation, then memory and imagination. What is the last thing left that is ourselves? Avicenna argues that consciousness, our awareness, is the last thing and the most essential part of ourselves. If we are conscious, we can be said to exist, even if we forget who we are or cannot distinguish ourselves from anything else.
In his Discourse on Method, Descartes lays out his remarkably similar Deceiving Demon thought experiment. Descartes says that it seems certain that he is sitting by the fire writing, but he can doubt this and believe that he is simply dreaming. This is similar to Zhuangzi, the ancient Chinese Daoist, who after dreaming he was a butterfly supposed that he might now be a butterfly dreaming that he is a man named Zhuangzi.
Descartes says that he can imagine a deceiving demon is creating a false world, like a dream, such that Descartes is not actually Descartes or sitting by a fire. However, there is one thing that the demon cannot be deceiving Descartes about, if that is his real name, and that is his consciousness. Thus, Descartes famously concludes, "I think therefore I am".
Where does the deceiving demon of Descartes come from? The Cathars, Gnostic Manichaean Christians persecuted in France in the 1400s, believed that this world is a lie ruled by Satan, much like the shadows on the wall of Plato's Cave. The Catholic Church denounced this as heresy, arguing that God ruled the world and spoke through the Church. Descartes, the first modern European philosopher, argues that we can trust the dogmas of the Church and the discoveries of science, as our world is not simply a lie as Gnostics claim. He argues this based on the same conclusion that Avicenna reached, though Avicenna uses anesthetics rather than a demon. There is a good possibility that Descartes was influenced by Avicenna, though few consider the incredible impact of the Islamic golden age on the European Enlightenment.
Lyotard, Postmodernism & the Metanarative of the Ancestors
In The Postmodern Condition, Lyotard ("leo-TAR") argues that all cultures, ancient and modern, legitimate themselves through the telling and retelling of narratives, stories that give cultures purpose and meaning. The story of the European Enlightenment and the Age of Reason separating the West from the rest of humanity remains the metanarrative of today, central to the creation of meaning in our culture, the big story on which countless smaller stories are stacked. The heroic West, it is said, brings freedom to the world through democracy and reason to the world through science. Lyotard compares this story of "salvation for all" to the similar metanarratives of Christianity and Marxism.
Without faith and trust in the metanarrative, retelling and rebinding ourselves and others to it, many would have little idea what their lives or our culture mean. Because so many have stacked their own story and the meaning of their lives on top of the dominant story and meaning, if you question the way of the ancestors and poke the bear spirit, if you doubt that our practices of democracy and science are bringing freedom and wellbeing to everyone, to many you are an outsider, a dangerous deviant who threatens the safety of the tribe.
Unfortunately for the metanarrative, the horrors of WWII and the manufactured genocide at Auschwitz spawned the countercultural attacks of the fifties, sixties and seventies. Counterculturals began asking out loud if the story of Western progress is also a mask for brutality and if the West is much like the rest, ignorant and authoritarian.
Jack Kerouac wrote of the "beat generation", the beatnik youth of the fifties who turned from American conformity, tired and doubtful of consumerism and the Korean War. The Civil Rights Movement of the sixties called for revolutionary changes to American democracy, which openly excluded many due to race and gender, at the same time protesting the Vietnam War.
Lyotard argues that Postmodernism is a playful engagement with many conflicting micronarratives, alternatives that have emerged in the space created by the questioning of the grand metanarrative. While critics argued that Postmodernism and the end of the metanarrative is itself a new metanarrative, Lyotard countered that the metanarrative of the progress of the West is far from dead, merely resisted here and there by a variety of countercultures. For many, the dominance of wealthy nations, the environmental impact of technology on the world's poor and the supremacist nature of the Western metanarrative is unquestioned, either out of ignorance or with regret that has no faith in an alternative.
Critics of Lyotard and Postmodernism continue to ask whether this is a cure for the condition or merely another symptom. Is Postmodernism, like the narrative of modernity, genuine liberation, or is it merely a safety valve to accommodate counterculturals, scholars and gallery goers who are disenchanted but still require entertainment?
UNBOXED: Existentialism, Postcolonialism & the Other
Others and otherness is a major theme of Existentialism and Postcolonialism, two popular philosophical movements in modern thought.
Sartre, who borrowed the term 'existential' from Heidegger, coined the term 'Existentialism' as the name for his own skeptical and individual-centered school of thought, including Kierkegaard, Nietzsche, and Heidegger as forerunners. Sartre, like these others before him, argued that we must have the courage to question what we believe and recreate our beliefs for ourselves, giving our own meaning to our lives rather than letting it be supplied by others. While it is easy to accept the authority of politics, religion and science without question, we are each responsible for our beliefs and doubts, and we can choose to be revolutionary individuals and inspire others.
Fanon, friend of Sartre and fellow Existentialist, was born on the Caribbean island and French colony of Martinique, and he became a central inspiration of Postcolonialism, the study of the aftereffects of European domination and colonization of the world. Fanon experienced racism in Martinique, France, and North Africa, and as a psychiatrist he argued that racism has a destructive impact on the mental and physical health of the oppressed. Modern studies have shown that it has a similar impact on the oppressor as well.
The gaze of the other is important in the thinking of both Sartre and Fanon. In Sartre's play No Exit, the frustrated main character famously declares, "Hell is other people!". We find the gaze of others frightening, because we are afraid of the impact they can have on our own opinion of ourselves.
Marcus Aurelius, the Roman emperor and Stoic philosopher, said that it is strange that everyone loves themselves more than anyone else, but values the opinions of others about themselves more than they value their own. Because we are insecure, we are terrorized by the other and the impact that their judgements can have on the meaning of our lives. If we face the other with good faith in the possibility of positive change, interaction with others can be powerfully transformative, but we are afraid that it could take all meaning away and leave us with nothing.
For both Sartre and Fanon, racism is a primary example of the frightening but potentially liberating gaze of the other. Sartre wrote about Antisemitism in the years following the Nazi occupation of Paris and racism against Jews in both France and Germany. Fanon wrote about racism against Africans in European colonies such as the Americas, and both wrote about racism against Africans and Arabs in North Africa. Africans, Arabs and others are devalued to affirm the glory and achievements of Europeans, including colonial and financial control of the globe. When we categorize ourselves and others as superior or inferior, we are avoiding the difficult but fruitful task of individual critical thinking.
It is easy to treat others as categories rather than as individuals, but if we treat others as genuine human individuals it allows us to change who we are as individuals, if we embrace the opportunity. We each change throughout our lives, as we are changed by others, whether we embrace this or not. If we accept ourselves and the impact that others can and will have on us, we have more choice in what we want our lives to mean. If we accept that we are insecure and do not have total control, we can open up to ourselves and others, embracing change and interaction with others not as a threat, but as an adventure.
Sources for Multicultural Perspective
Europe and the People Without History, by Eric R. Wolf, University of California Press, 1982
Multiculturalism: A Critical Reader, ed. by David Theo Goldberg, Blackwell, 1994
Are We Born Racist? New Insights from Neuroscience and Positive Psychology, ed. by Jason Marsh, Rodolfo Mendoza-Denton & Jeremy Adam Smith, Beacon Press, 2010
Race: The History of an Idea in the West, by Ivan Hannaford, Johns Hopkins University Press, 1996
The Race Myth: Why We Pretend Race Exists In America, by Joseph L. Graves Jr., Plume, 2005
Against Race: Imagining Political Culture Beyond the Color Line, by Paul Gilroy, Harvard Press, 2001
Ethnomathematics: Challenging Eurocentrism in Mathematics Education, ed. by Arthur B. Powell & Marilyn Frankenstein, SUNY Press, 1997
History Begins at Sumer: Thirty-Nine Firsts in Recorded History, by Samuel Noah Kramer, University of Pennsylvania Press, 1981
Aztec Thought and Culture: A Study of the Ancient Nahuatl Mind, University of Oklahoma Press, 1971
Ancient Egyptian Literature (3 Volumes), ed. by Miriam Lichtheim, University of California Press, 2006
The African Origin of Civilization, by Cheikh Anta Diop, Lawrence Hill Books, 1967
Black Athena: The Afroasiatic Roots of Classical Civilization, by Martin Bernal, Rutgers, 1987
Gifts from the Pharaohs: How Egyptian Civilization Shaped the Modern World, by Christiane Desroches Noblecourt, Flammarion, 2007
Athens and Persia in the Fifth Century BC: A Study in Cultural Receptivity, by Margaret C. Miller, Cambridge, 2004
Ethnic Identity in Greek Antiquity, by Jonathan M. Hall, Cambridge Press, 2000
Athens on Trial: The Antidemocratic Tradition in Western Thought, by Jennifer Tolbert Roberts, Princeton Press, 1994
Bomb, Book & Compass: Joseph Needham and the Great Secrets of China, by Simon Winchester, Viking Press, 2008
Orientalism, by Edward Said, Vintage Press, 1994
The House of Wisdom: How Arabic Science Saved Ancient Knowledge & Gave Us The Renaissance, by Jim Al-Khalili, Penguin Press, 2011


text:
Current software, advanced techniques, modern technology, and personal attention.
Robinson Metal has always taken pride in offering the exact services our customers need. That includes using the latest welding techniques to having the most current, up-to-date programming software versions. We understand that attention to the small details often makes a huge difference in quality metal fabrication.
To consistently deliver the best, we complement our one-on-one personal attention with our topflight services: design and engineering; AWS- and ASME-certified welding; coatings; metal forming and stamping; assembly; water jet and laser cutting and many more.
Review our services and see how Robinson goes beyond the typical metal fabricator. Click a service to reveal more and get started!


text:
It is easy to find a man in almost any line of employment who is twice as efficient as another employee, but it is very rare to find one who is ten times as efficient. It is common, however, to see one man possessing not ten times but a thousand times the wealth of his neighbor.
-- Willford I. King The Wealth and Income of the People of the United States (1915)
In this week's Sift:
- Propaganda Lessons From the Religious Right. It's no longer enough just to correct the specific misinformation that comes from the Right. We need to figure out how their propaganda works.
- Distribution of Wealth. Concentrated wealth at the top isn't just bad for the people at the bottom. It's bad for the economy in general.
- Short Notes. Why Koran-burning is news now. What teaching in Florida is really like. Haley Barbour's fictional history of southern Republicans. What the WaPo can learn from Digby. And the Dutch example for dealing with teen sex.
The Weekly Sift is now on Facebook. I haven't done much with the page yet, but keep watching. If you have advice, write on the wall.
The most frustrating thing about this election campaign is how much of it is based on nonsense and fantasy. If we were just losing a reasonable debate about, say, the role of government, I think we'd all know what to do: go back to the drawing board and come up with better policies and better ways of explaining them.
But what if we lose because sizable numbers of people believe that President Obama is a Muslim who hates white people? Or that the new health-care law institutes death panels? Or that the Democrats are part of some sinister plot to recruit children into homosexuality or impose sharia law?
What drawing board do we go back to then?
So often we seem to be in a battle with something we can't see. The other side makes a claim that is provably false -- like that Obama has raised taxes or quadrupled the deficit -- and rather than ask for examples or evidence, large numbers of people just nod their heads. We can't get important issues like global warming or the increasing concentration of wealth on the national agenda, while the other side can conjure issues like the ground zero mosque or Obama's czars out of thin air.
How does that work?
In a word, the problem is propaganda: The Right has the Left way outclassed in terms of propaganda. And because most of us have no idea how propaganda works, we feel like we're battling with ghosts.
For a long time the Sift has been pruning the branches of propaganda: I do a Disinformation Watch article every now and then, and most weeks some outrageous lie gets debunked in the Short Notes. But that's like digging up individual dandelions. The other side can produce a hundred new lies in the time it takes to debunk one.
This week I want to look at the larger structure of propaganda: Why does it work? Why are so many people so ready to believe these things?
Beyond Lying. The fundamental misconception most liberals have about propaganda is that it's just lying: Say something false, repeat it often enough, and people will start to believe it. Superficially, "death panels" worked that way. Overnight the phrase was everywhere, repeated by so many people that it seemed like there must be something to it, even it had been exaggerated.
But if propaganda was just lying, then truth-telling would undo it. All we'd have to do would be to get more people telling our truth than their lie, and we'd win.
How often have you seen that work?
Beyond Framing. A frame is a metaphoric template that organizes the individual facts about an issue. What makes them so effective is that most of the action is unconscious: You can invoke a frame by using some of its words and images, without ever justifying that it's the right way to think about the issue. When neo-cons talked about "appeasing" Saddam, that one word invoked the whole Hitler/Munich frame, in which the enemy is implacable and war is inevitable. And because those ideas stayed in the background, they didn't have to support them with evidence.
The problem is that counter-framing also doesn't work very often -- for reasons that liberal framing godfather George Lakoff understands but has trouble communicating. It's in his books, but it seldom comes across.
What most liberals miss about framing is that effective framing doesn't happen in mid-debate. Effective framing is laid down in layers, over decades or even centuries. (Ironically, this is why the word framing frames its subject badly. Framing suggests a one-time event where you decide what's in the picture and what's out.)
The only way I can think to explain this is through the example of a small-but-specific issue: The current religious-right argument that anti-bullying campaigns in the schools are part of some sinister gay agenda that takes away the rights of Christian parents. And I want to describe some of the layers of frames that make their argument so undeservedly convincing and so hard to argue against.
It Starts With the Devil. Like a lot of traditional faiths, the Christian Right's theology includes a Devil. This isn't the place to argue about the existence of a Prince of Darkness, but I want to point out what you can do once you have a Devil in your theology.
The Devil is the ultimate sinister conspirator, motivated by pure evil. Once you have a Devil, it follows without evidence that there is a conspiracy against anything true and good and right. How could there not be? The Devil is against it, and unless he has suddenly lost his innate cleverness and his characteristic ability to lie and tempt and cajole, he will have followers.
So if you are arguing in front of a Devil-postulating audience, you don't have prove that there is a conspiracy against the Good -- of course there is -- you only have to identify that conspiracy. The Manichean frame (God/Devil, Good/Evil) is sitting there, waiting for you to connect yourself with Light and your opponent with Darkness.
Once you've done that, the hardest part of establishing a conspiracy theory -- giving it a motive -- is accomplished. So when President Bush said of terrorists
They are a movement defined by their hatreds. They hate progress, and freedom, and choice, and culture, and music, and laughter, and women, and Christians, and Jews, and all Muslims who reject their distorted doctrines.
large numbers of people just nodded their heads in recognition. They didn't ask for evidence that such people exist or wonder why anyone would sign up with them. The Devil has minions. How could he not?
Layer II: Reverse discrimination. The second layer isn't quite so universal as the Devil, but it has been used for decades in so many circumstances that it also can be invoked largely without evidence: Maybe the weak were persecuted generations ago, but in our era the tables have been turned, and it is actually the strong that are persecuted.
Now, it is claimed, the law favors blacks over whites, non-Christians over Christians, the poor over the rich, gays over straights, foreigners over English-speakers, illegal immigrants over citizens, and on and on and on.
In general, minority rights are controversial in a democracy, and special action is required to make things equal. But no matter how bad things are for the minority in reality, the special action can always be cast as some kind of privilege. (The Little Rock Nine were escorted by the 101st Airborne Division. But I had to fend for myself when I went to high school.)
Almost invariably, the examples of reverse discrimination fall apart when looked at closely. (The Christian church near Ground Zero that hasn't been rebuilt yet was part of a deal involving millions in public money. It's not an example of Christians being treated worse than Muslims.) Majorities are powerful in America, and they can get their cases favorably resolved.
This layer serves two purposes. First, it corrupts the language of equality, devaluing it in the same way that counterfeit money devalues real money. "You're discriminated against? No, look at me, I'm discriminated against."
But in the longer term, the second purpose is even more significant: By constant repetition, the notion that the majority is persecuted becomes axiomatic -- at least in the eyes of the majority. If a minority is claiming rights and wanting government intervention, it must be trying to claim an advantage. There's no need to specify that advantage too exactly, or to substantiate examples of majority persecution.
You can see Layers I and II working together in the claim that same-sex-marriage advocates want to destroy traditional marriage. ("this is the ultimate goal of activists," writes James Dobson, "and they will not stop until they achieve it.") It's an unmotivated conspiracy of the minority to oppress the majority. What would same-sex couples gain by destroying traditional marriage? How are opposite-sex couples harmed when same-sex couples marry? Among the faithful these questions are answered by the unconscious assumptions in the frame; more specific answers are unnecessary.
Tactics. There are other layers that have taken decades to lay down -- the poor are lazy, traditional sexual morality is related to non-sexual moral issues like honesty and integrity -- but lets just stick with those two and see how they influence tactics. The main thing to remember is: When you work within a long-established frame, you don't have to prove anything, you just have to fill in the blanks.
Think about Glenn Beck's chalkboard talks. If you make yourself watch one, I predict you'll come out saying, "What was that all about?" They're all names and labels: So-and-so is a Marxist and is connected to this other guy who has some kind of relationship with Obama. It doesn't sound like an assemblage of evidence, because it isn't. He's just helping his audience identify an enemy that abstract principles tell them must exist.
And only now do the lies come in: to vilify somebody like Van Jones. And pointing out that the lies are lies gains very little: The point is the pattern of accusations, and if this one or that one isn't true, well, what of it?
The lies exist inside a web of mischaracterization. No enemies are quoted in complete sentences or allowed to speak in their own words at length and in context. Everything is summarized and labelled.
Applied Tactics. The easiest way to see how tactics work is to look at some small issue you haven't thought much about before. For me this week, that was the Religious Right's attempt to smear a campaign against bullying in schools. (It's part of the "gay agenda" to "sneak homosexuality lessons into classrooms".)
It's a comparatively young smear, so you can read a nearly complete collection of documents in a short time. Start with an article called Parents beware of deceptive "anti-bullying" initiatives. (You can pull the glossier print version off the truetolerance.org main menu.)
If you come to the article wondering what is happening that you as a parent should worry about, you will be confused. LIke the Beck chalktalk, most of it goes right past the uninitiated, leaving a "What was that about?" feeling.
Instead you'll learn that local anti-bullying organizations have "ties" to gay-friendly organizations. (Given how often bullying involves insults like "queer" or "faggot", it would be strange if they didn't.) They're also "tied" to "President Obama's controversial 'Safe Schools czar' Kevin Jennings". (Czars are bad, even when they're doing exactly what their job titles indicate.)
You'll also learn about things that might happen or even could be happening right now: gay activists "infiltrating classrooms" which would be "transformed into indoctrination centers" with "mandatory homosexuality lessons". But you're well into the second page before you run into anything that actually did happen:
the Illinois Safe Schools Alliance [was] heavily involved in crafting state legislation that makes "sexual orientation" and "gender-related identity" protected categories in schools.
No clue what that would actually mean in terms of stuff happening in the schools, but it plugs into the "special rights" frame. The minority is oppressing the majority again! When good Christian kids scream "queer!" in some other kid's face, they will be in trouble instead of the homo.
A variety of books and videos are identified as things to watch out for. They are pejoratively summarized in a few words, never linked to, and never quoted in complete sentences. The only way you can check these summaries is if they mention a title you can google and look up on your own.
(I managed to look up and read Just The Facts About Sexual Orientation and Youth, a pamphlet intended for teachers and school administrators. The religious-right counter-pamphlet Just the Real Facts Please, is then easily seen to be a collection of non-sequiturs that use out-of-context quotes as excuses to go off on tangents. But how many people are going to go to that much trouble? Most will just know that there is a good pamphlet refuting the bad pamphlet.)
What to do? Imagine being a liberal parent and having a religious-right parent give you Parents Beware as part of a we-have-to-do-something talk. What can you say? You can't argue with a case that hasn't been made, with "ties" and sinister fantasies that don't involve any checkable facts. It is impossible to prove that some organization you just heard of isn't in league with the Devil.
This problem shows up again and again. Take the so-called Ground Zero Mosque: What exactly its opponents are afraid of and what exactly they want to do about it has remained fluid. Arguing about it has been like wrestling with a jello monster.
Tactically, when you have these kinds of discussions one-on-one, I recommend a judo strategy: Draw the other side out before you object. You can't argue with unconscious assumptions, so make them state a problem and propose a solution. If they can't, ridicule them for that -- don't take the bait and go down some tangent.
Long-term, we need to recognize that we can't re-frame issues in mid-debate just by making up new slogans and new metaphors from scratch. The other side is using multiple layers of frames, the deepest of which have been laid down centuries ago. We need to get in touch with our own deep layers (which go back to the Enlightenment, the Sermon on the Mount, and timeless notions of fairness) and work to nurture and promote those ideas in everything we do. When we do that, we can speak with a power and authenticity that is very different from "spin".
Wednesday in DailyKos I addressed a different level of propaganda: How right-wing money creates bogus think tanks whose bogus experts get quoted even in supposedly liberal venues like the New York Times.
Just about the only time I hear the phrase distribution of wealth these days is when somebody like Glenn Beck talks about redistribution of wealth -- that's when the evil Marxists come, take away the money you earned by your hard work and brilliance, and give it to the lazy stupid people.
This week, though, Slate's Timothy Noah started a series called The Great Divergence, about why the portion of our national income that goes to the rich has grown so much over the last 30 years. (Inequality peaked just before the Great Crash in 1929, fell from the 30s through the 70s, and recently has returned to 1929 levels.)
I had planned to cover that series in this week's Sift, but it isn't finished yet. So next week I'll discuss Noah's points (and possibly the new book Winner-Take-All Politics which takes on related issues).
This week I just want to make one point: It's no coincidence that high concentrations of wealth and bad economies go together. When you shift money from the poor and middle class to the rich, demand drops. That can turn into a deflationary cycle if business adjusts to lower demand by cutting jobs, which then lowers demand further.
What was the real difference between the Happy-Days economy of the 50s and the Grapes-of-Wrath economy of the 30s? We had the same natural resources, similar technology, similar culture. But in between, the war gave our government a reason to tax the rich and spend an enormous amount of money. That shifted the distribution of wealth, moving the economy to a high-demand, high-production mode rather than a low-demand, low-production mode.
Since the Reagan administration, we've been doing the reverse.
The best coverage of the Koran-burning minister came from Rachel Maddow:
For the most part, [this story] has been talked about in terms of religious freedom and First Amendment rights. That's the way that the national, responsible mainstream media dealt with this story. But that's actually the wrong frame for this story. He is a kook doing as kooks do.
Religious nutjobs have burned Korans in public before and no one cared. But they're newsworthy now because supposedly serious political figures like Newt Gingrich are mining the same vein of war-with-Islam craziness.
A major piece of the conservative government-is-evil rhetoric is to demonize everybody who gets a paycheck from the taxpayers: They're all lazy parasites (unless they die, like the 9-11 firefighters).
From the Facebook wall of my sister the teacher, an essay by a Florida teacher explaining how things really are:.
I am required to teach Social Studies and Writing without any curriculum/materials provided, so I purchase them myself. I am required to conduct Science lab without Science materials, so I buy those, too. The budgeting process has determined that copies of classroom materials are too costly, so I resort to paying for my copies at Staples, refusing to compromise my students' education because high-ranking officials are making inappropriate cuts. It is February, and my entire class is out of glue sticks. Since I have already spent the $74 allotted to me for warehouse supplies, if I don't buy more, we will not have glue for the remainder of the year.
No doubt she's living like a princess on her $28K a year.
Here's what I wonder: Each kind of government worker -- teachers, police, fire, and so on -- knows that the conservative rhetoric about them is false. Do they realize that it's false about the other government workers too? Or do they believe that the folks at the DMV are living it up?
Haley Barbour is rewriting the history of civil rights in the South to put himself and the Republican Party on the right side. The truth: When the Democrats embraced civil rights, white racists switched parties and became Republicans. And they were welcomed with open arms.
Digby points out one way in which bloggers are more thorough than Washington Post reporters: Before we quote a congressman, we'll google him to make sure he's real.
You know whose statistics on teen pregnancy and STDs we should envy? The permissive Dutch.
The Weekly Sift appears every Monday afternoon. If you would like to receive it by email, write to WeeklySift at gmail.com.


text:
To live authentically and with integrity in the face of a rampant oppression, which daily seeks to sequester the spirit and rape the soul, one must recognize themselves as one with the God and in this move each day with an authority grounded in a great mystical love which really has no words. Authenticity and Imagination in the Face of Oppression is an autobiography of faith. It is the life of a black transgender woman living a life of faith in the face of institutional and economic oppressions, and the cultural and social stigma of racism and transgender phobia. This book emerges then as a strategy for liberation by nourishing the soul through the provocative acts of prayer, memory, sharing, and acting, thus making real a sure hope grounded in the divine call of Isaiah 61:1. Authenticity and Imagination in the Face of Oppression is a hopeful discourse on mysticism in the context of loving one's God and oneself within a lived communal reality of earth embodiment and the development of a sacred space of irresistible hope. ""None of us is just one thing. Cross shares with readers a complex life's work as an invitation to de-colonize one's mind and body in order to do more self-discovery and God-discovery. How glad I am this preacher shares her discoveries of sacred black masculinities and femininities. In the tradition where 'reading can be a revolutionary act,' now readers can invert the white gaze on gender and get to work unchaining literal, intellectual, ideological, and physical concrete blocks."" --Malcolm Himschoot, United Church of Christ, Showing Up for Racial Justice Northeast-Ohio ""Drawing from her embodied, experienced memories growing up black and male, and eventually as a transgendered black female in a hetero-normative, white supremacist society, the Reverend Monica Cross invites us into a story of healing, liberation, and embracing differences so we all might learn to de-colonize our bodies from the straight jackets of hetero-normativity, racism, sexism, and CIS-genderism. This is a book about the multitudes each of us contains beyond dictated societal norms, if we only would allow ourselves to be something different."" --Whitney Bauman, Author; Associate Professor of Religious Studies, Florida International University Rev. Monica Joy Cross is a Transgender Scholar-Activist and public intellectual who serves as an Associate Minister at Tapestry Ministries, Christian Church Disciples of Christ in Berkeley, California. Monica received a Masters of Divinity degree from Pacific School of Religion in 2012 and a Masters in Religious Leadership for Social Change degree from Starr King School for the Ministry in 2014. While being a native of Southern California, Rev. Monica Cross currently makes her home in Richmond, California.
Bog, hæftet
Hvis denne bog ikke er noget for dig, kan du benytte kategorierne nedenfor til at finde andre titler. Klik på en kategori for at se lignende bøger.